1$ ! vms/install.com -- set up nethack 'playground' 2$ ! 3$ ! Use vmsbuild.com to create nethack.exe, makedefs, and lev_comp *first*. 4$ ! 5$ ! Edit this file to define gamedir & gameuic, or else invoke it with two 6$ ! command line parameters, as in: 7$ ! @[.sys.vms]install "disk$users:[games.nethack]" "games" 8$ ! or @[.sys.vms]install "[-.play]" "[40,1]" 9$ ! 10$ ! default location is old playground, default owner is installer 11$ gamedir = f$trnlnm("NETHACKDIR") !location of playground 12$ if gamedir.eqs."" then gamedir = f$trnlnm("HACKDIR") 13$ gameuic = f$user() !owner of playground 14$ ! --- nothing below this line should need to be changed --- 15$ if p1.nes."" then gamedir := 'p1' 16$ if p2.nes."" then gameuic := 'p2' 17$ 18$ ! note: all filespecs contain some punctuation, 19$ ! to avoid inadvertent logical name interaction 20$ play_files = "PERM.,RECORD.,LOGFILE.,PANICLOG." 21$ help_files = "HELP.,HH.,CMDHELP.,WIZHELP.,OPTHELP.,HISTORY.,LICENSE." 22$ data_files = "DATA.,RUMORS.,ORACLES.,OPTIONS.,QUEST.DAT" 23$ guidebook = "[.doc]Guidebook.txt" 24$ invoc_proc = "[.sys.vms]nethack.com" 25$ trmcp_file = "[.sys.share]termcap" 26$ spec_files = "AIR.LEV,ASMODEUS.LEV,ASTRAL.LEV,BAALZ.LEV,BIGRM-%.LEV," - 27 + "CASTLE.LEV,EARTH.LEV,FAKEWIZ%.LEV,FIRE.LEV," - 28 + "JUIBLEX.LEV,KNOX.LEV,MEDUSA-%.LEV,MINEFILL.LEV," - 29 + "MINETN-%.LEV,MINEND-%.LEV,ORACLE.LEV,ORCUS.LEV," - 30 + "SANCTUM.LEV,SOKO%-%.LEV,TOWER%.LEV,VALLEY.LEV," - 31 + "WATER.LEV,WIZARD%.LEV" 32$ spec_input = "bigroom.des castle.des endgame.des " - 33 + "gehennom.des knox.des medusa.des mines.des " - 34 + "oracle.des sokoban.des tower.des yendor.des" 35$ qstl_files = "%%%-GOAL.LEV,%%%-FIL%.LEV,%%%-LOCA.LEV,%%%-STRT.LEV" 36$ qstl_input = "Arch.des Barb.des Caveman.des Healer.des " - 37 + "Knight.des Monk.des Priest.des Ranger.des Rogue.des " - 38 + "Samurai.des Tourist.des Wizard.des Valkyrie.des" 39$ dngn_files = "DUNGEON." 40$ dngn_input = "dungeon.pdf" 41$ dlb_files = help_files + "," + data_files + "," - 42 + spec_files + "," + qstl_files + "," + dngn_files 43$ data_libry = "nh-data.dlb" 44$ xtrn_files = "LICENSE.,HISTORY.,OPTIONS." 45$ makedefs := $sys$disk:[-.util]makedefs 46$ lev_comp := $sys$disk:[-.util]lev_comp 47$ dgn_comp := $sys$disk:[-.util]dgn_comp 48$ dlb := $sys$disk:[-.util]dlb 49$ milestone = "write sys$output f$fao("" !5%T "",0)," 50$ if p3.nes."" .and. f$edit(p4,"UPCASE").nes."VERBOSE" then milestone = "!" 51$ echo = "write sys$output" 52$ warn = echo !could be "write sys$error" 53$! 54$! make sure we've got a playground location 55$ gamedir := 'gamedir' 56$ if gamedir.eqs."" then gamedir = "[.play]" !last ditch default 57$ gamedir = f$parse(gamedir,,,,"SYNTAX_ONLY") - ".;" 58$ if gamedir.eqs."" then write sys$error "% must specify playground directory" 59$ if gamedir.eqs."" then exit %x1000002C !ss$_abort 60$ 61$! 62$! ['p3' is used in Makefile.top] 63$ if p3.nes."" then goto make_'p3' 64$ 65$ milestone "<installation...>" 66$! 67$make_data_plus_dlb: 68$make_data: 69$ ! start from a known location -- [.sys.vms] 70$ set default 'f$parse(f$environment("PROCEDURE"),,,"DIRECTORY")' 71$! generate miscellaneous data files 72$ set default [-.-.dat] !move to data directory 73$ milestone "(data)" 74$ makedefs -d !data.base -> data 75$ milestone "(rumors)" 76$ makedefs -r !rumors.tru + rumors.fal -> rumors 77$ milestone "(oracles)" 78$ makedefs -h !oracles.txt -> oracles 79$ milestone "(dungeon preprocess)" 80$ makedefs -e !dungeon.def -> dungeon.pdf 81$ milestone "(quest text)" 82$ makedefs -q !quest.txt -> quest.dat 83$ milestone "(special levels)" 84$ lev_comp 'spec_input' !special levels 85$ milestone "(quest levels)" 86$ lev_comp 'qstl_input' !quest levels 87$ milestone "(dungeon compile)" 88$ dgn_comp 'dngn_input' !dungeon database 89$ set default [-] !move up 90$ if p3.nes."" .and. f$edit(p3,"UPCASE").nes."DATA_PLUS_DLB" then exit 91$ 92$make_dlb: 93$ ! start from a known location -- [.sys.vms] 94$ set default 'f$parse(f$environment("PROCEDURE"),,,"DIRECTORY")' 95$! construct data library 96$ set default [-.-.dat] !move to data directory 97$ milestone "(dlb setup)" 98$! since DLB doesn't support wildcard expansion and we don't have shell 99$! file globbing, start by making a file listing its intended contents 100$ create nhdat.lst 101$ if f$search("nhdat.lst;-1").nes."" then - 102 purge/noConfirm/noLog nhdat.lst 103$! an old data file might fool us later, so get rid of it 104$ if f$search(data_libry).nes."" then - 105 delete/noConfirm/noLog 'data_libry';* 106$ if f$trnlnm("PFILE$").nes."" then close/noLog pfile$ 107$ open/Append pfile$ nhdat.lst 108$ i = 0 109$dloop: 110$ g = f$element(i,",",dlb_files) 111$ if g.eqs."," then goto ddone 112$ wild = f$locate("*",g).ne.f$locate("%",g) 113$ fcnt = 0 114$floop: 115$ f = f$search(g) 116$ if f.eqs."" then goto fdone 117$ fcnt = fcnt + 1 118$! strip device, directory, and version from name 119$ f = f$parse(f,,,"NAME") + f$parse(f,,,"TYPE") 120$! strip trailing dot, if present, and change case 121$ f = f$edit(f + "#" - ".#" - "#","LOWERCASE") 122$ if f$extract(3,1,f).eqs."-" then - !"xyz-foo.lev" -> "Xyz-foo.lev" 123 f = f$edit(f$extract(0,1,f),"UPCASE") + f$extract(1,255,f) 124$ write pfile$ f 125$ if wild then goto floop 126$fdone: 127$ if fcnt.eq.0 then warn "? no file(s) found for """,g,"""" 128$ i = i + 1 129$ goto dloop 130$ddone: 131$ close pfile$ 132$ milestone "(dlb create)" 133$ dlb "-cfI" 'data_libry' nhdat.lst 134$ set default [-] !move up 135$ if p3.nes."" then exit 136$ 137$! 138$! set up the playground and save directories 139$ milestone "(directories)" 140$make_directories: 141$ srctree = f$environment("DEFAULT") 142$ set default 'gamedir' 143$ if f$parse("[-]").eqs."" then create/dir/log [-] !default owner & protection 144$ if f$parse("[]" ).eqs."" then - !needs to be world writable 145 create/directory/owner='gameuic'/prot=(s:rwe,o:rwe,g:rwe,w:rwe)/log [] 146$ if f$search("SAVE.DIR;1").eqs."" then - 147 create/directory/owner='gameuic'/prot=(s:rwe,o:rwe,g:rwe,w:rwe)/log - 148 [.SAVE]/version_limit=2 149$ set default 'srctree' 150$ if p3.nes."" then exit 151$! 152$! create empty writeable files -- logfile, scoreboard, multi-user access lock 153$! [if old versions are already present, validate and retain them if possible] 154$make_writeable_files: 155$ milestone "(writeable files)" 156!-!$ create/owner='gameuic'/prot=(s:rwed,o:rwed,g:rwed,w:rwed) - 157!-! 'gamedir''play_files' 158$ i = 0 159$ploop: if f$trnlnm("PFILE$").nes."" then close/nolog pfile$ 160$ f = f$element(i,",",play_files) 161$ if f.eqs."," then goto pdone 162$ i = i + 1 163$ f = gamedir + f 164$ if f$search(f).eqs."" then goto pmake !make it if not found 165$ if f$file_attrib(f,"RFM").nes."STMLF" then goto prej !must be stream_lf 166$ open/read/error=prej pfile$ 'f' 167$ read/end=ploop pfile$ pline !empty is ok 168$ close pfile$ 169$ pfield = f$element(0," ",pline) !1st field is version number 170$ if f$locate(".",pfield).lt.f$length(pfield) then goto ploop !keep 171$prej: rename/new_vers 'f' *.old !reject old version 172$pmake: create/fdl=sys$input:/owner='gameuic' 'f'/log 173file 174 organization sequential 175 protection (system:rwd,owner:rwd,group:rw,world:rw) 176record 177 format stream_lf 178$ goto ploop 179$pdone: 180$ if p3.nes."" then exit 181$! 182$! copy over the remaining game files, then make them readonly 183$make_readonly_files: 184$ milestone "(readonly files)" 185$ if f$search("[.dat]''data_libry'").nes."" 186$ then call copyfiles 'f$string(data_libry+","+xtrn_files)' [.dat] "r" 187$ else !'dlb_files' is too long for a single command 188$ k = 200 + f$locate(",",f$extract(200,999,dlb_files)) 189$ call copyfiles 'f$extract(0,k,dlb_files)' [.dat] "r" 190$ call copyfiles 'f$extract(k+1,999,dlb_files)' [.dat] "r" 191$ endif 192$ if p3.nes."" then exit 193$! 194$make_executable: 195$ milestone "(nethack.exe)" 196$ call copy_file [.src]nethack.exe 'gamedir'nethack.exe "re" 197$ if p3.nes."" then exit 198$! 199$! provide invocation procedure (if available) 200$make_procedure: 201$ if f$search(invoc_proc).eqs."" then goto skip_dcl 202$ if f$search("''gamedir'nethack.com").nes."" then - 203 if f$cvtime(f$file_attr("''gamedir'nethack.com","RDT")) - 204 .ges. f$cvtime(f$file_attr(invoc_proc,"RDT")) then goto skip_dcl 205$ milestone "(nethack.com)" 206$ call copy_file 'invoc_proc' 'gamedir'nethack.com "re" 207$skip_dcl: 208$ if p3.nes."" then exit 209$! 210$! provide plain-text Guidebook doc file (if available) 211$make_documentation: 212$ if f$search(guidebook).eqs."" then goto skip_doc 213$ milestone "(Guidebook)" 214$ call copy_file 'guidebook' 'gamedir'Guidebook.doc "r" 215$skip_doc: 216$ if p3.nes."" then exit 217$! 218$! provide last-resort termcap file (if available) 219$make_termcap: 220$ if f$search(trmcp_file).eqs."" then goto skip_termcap 221$ if f$search("''gamedir'termcap").nes."" then goto skip_termcap 222$ milestone "(termcap)" 223$ call copy_file 'trmcp_file' 'gamedir'termcap "r" 224$skip_termcap: 225$ if p3.nes."" then exit 226$! 227$! done 228$ milestone "<done>" 229$ define/nolog nethackdir 'gamedir' 230$ define/nolog hackdir 'gamedir' 231$ echo - 232 f$fao("!/ Nethack installation complete. !/ Playground is !AS !/",gamedir) 233$ exit 234$ 235$! 236$! copy one file, resetting the protection on an earlier version first 237$copy_file: subroutine 238$ if f$search(p2).nes."" then set file/Prot=(s:rwed,o:rwed) 'p2' 239$ copy/Prot=(s:'p3'wd,o:'p3'wd,g:'p3',w:'p3') 'p1' 'p2' 240$ set file/Owner='gameuic'/Prot=(s:'p3',o:'p3') 'p2' 241$endsubroutine !copy_file 242$ 243$! 244$! copy a comma-separated list of wildcarded files, one file at a time 245$copyfiles: subroutine 246$ i = 0 247$lloop: 248$ g = f$element(i,",",p1) 249$ if g.eqs."," then goto ldone 250$ g = p2 + g 251$ wild = f$locate("*",g).ne.f$locate("%",g) 252$ fcnt = 0 253$eloop: 254$ f = f$search(g) 255$ if f.eqs."" then goto edone 256$ fcnt = fcnt + 1 257$ f = f - f$parse(f,,,"VERSION") 258$ e = f$parse(f,,,"NAME") + f$parse(f,,,"TYPE") 259$ call copy_file 'f' 'gamedir''e' "''p3'" 260$ if wild then goto eloop 261$edone: 262$ if fcnt.eq.0 then warn "? no file(s) found for """,g,"""" 263$ i = i + 1 264$ goto lloop 265$ldone: 266$endsubroutine !copyfiles 267$ 268$!<eof> 269