rooms.98 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744
  1. "GUTS OF FROB: BASIC VERBS, COMMAND READER, PARSER, VOCABULARY HACKERS."
  2. <SETG ALT-FLAG T>
  3. <GDECL (MUDDLE) FIX (TENEX?) <OR ATOM FALSE> (VERS DEV SNM SCRATCH-STR) STRING>
  4. <DEFINE SAVE-IT ("OPTIONAL" (FN <COND (<L? ,MUDDLE 100>"MADMAN;MADADV SAVE")
  5. (T "<MDL>MADADV.SAVE")>)
  6. "AUX" (MUDDLE ,MUDDLE) STV (ST <REMARKABLY-DISGUSTING-CODE>))
  7. #DECL ((FN) STRING (MUDDLE) FIX (STV) <OR STRING FIX>)
  8. <PUT <FIND-OBJ "PAPER"> ,ODESC1 <UNSPEAKABLE-CODE>>
  9. <SETG VERS .ST>
  10. <SETG SCRIPT-CHANNEL <>>
  11. <SETG RAW-SCORE 0>
  12. <SET IH <ON "IPC" ,ILO 1>>
  13. <HANDLER ,DIVERT-INT ,DIVERT-HAND>
  14. <COND (<G? .MUDDLE 100>
  15. <SETG SCRATCH-STR <ISTRING 32>>
  16. <SETG DEV "DSK">
  17. <SETG SNM "MDL">)
  18. (<SNAME "">
  19. <SETG DEV "DSK">
  20. <SETG SNM "MADMAN">)>
  21. <INT-LEVEL 100000>
  22. <COND (<=? <SAVE .FN> "SAVED"> <INT-LEVEL 0> T)
  23. (T
  24. ; "STARTER on 10x sets up tty correctly, setg's DEV to \"MDL\"
  25. if that device exists; if not, (sort of) returns directory muddle
  26. came from. On its it returns # zorkers currently in existence."
  27. <COND (<AND <TYPE? <SET STV <STARTER>> FIX>
  28. <G? .STV 3>>
  29. <OR <MEMBER <SETG XUNM <XUNAME>> ,WINNERS>
  30. <=? ,XUNM "SEC">
  31. <=? ,XUNM "ELBOW">
  32. <AND <OFF "CHAR" ,INCHAN>
  33. <TELL
  34. "There appears before you a threatening figure clad all over
  35. in heavy black armor. His legs seem like the massive trunk
  36. of the oak tree. His broad shoulders and helmeted head loom
  37. high over your own puny frame and you realize that his powerful
  38. arms could easily crush the very life from your body. There
  39. hangs from his belt a veritable arsenal of deadly weapons:
  40. sword, mace, ball and chain, dagger, lance, and trident.
  41. He speaks with a commanding voice:
  42. \"YOU SHALL NOT PASS \"
  43. As he grabs you by the neck all grows dim about you.">
  44. <QUIT>>>)
  45. (<TYPE? .STV STRING>
  46. <SETG SNM <SUBSTRUC ,SCRATCH-STR
  47. 0
  48. <- <LENGTH ,SCRATCH-STR>
  49. <LENGTH <MEMQ !\ .STV>>>>>)>
  50. <COND (<G? ,MUDDLE 100> <SETG TENEX? <GETSYS>>)
  51. (<APPLY ,IPC-OFF>
  52. <APPLY ,IPC-ON <UNAME> "ZORK">)>
  53. <SET BH <ON "BLOCKED" ,BLO 100>>
  54. <START "WHOUS" .ST>)>>
  55. "Stuff for diverting gc's"
  56. <SETG DIVERT-CNT 0>
  57. <SETG DIVERT-MAX 99>
  58. <SETG DIVERT-INC 4000>
  59. <SETG DIVERT-AMT 0>
  60. <SETG DIVERT-LMT 100000>
  61. <GDECL (DIVERT-CNT DIVERT-MAX DIVERT-INC DIVERT-AMT DIVERT-LMT) FIX>
  62. <DEFINE DIVERT-FCN (AMT REASON)
  63. <SETG DIVERT-CNT <+ ,DIVERT-CNT 1>>
  64. <SETG DIVERT-AMT <+ ,DIVERT-AMT ,DIVERT-INC .AMT>>
  65. <COND (<OR <G? ,DIVERT-CNT ,DIVERT-MAX>
  66. <G? ,DIVERT-AMT ,DIVERT-LMT>> ;"Too much diversion ?"
  67. <SETG DIVERT-AMT <SETG DIVERT-CNT 0>>
  68. <GC-FCN>
  69. <GC>)
  70. (ELSE ;"Divert this request for storage"
  71. <COND (<1? ,DIVERT-CNT> ;"First diversion ?"
  72. <HANDLER ,GC-INT ,GC-HAND>)>
  73. <BLOAT <+ .AMT ,DIVERT-INC>>
  74. ;"Get storage desired plus extra increment")>>
  75. <SETG DIVERT-HAND <HANDLER <SETG DIVERT-INT <EVENT "DIVERT-AGC" 1000>>
  76. ,DIVERT-FCN>>
  77. <OFF ,DIVERT-HAND>
  78. <DEFINE GC-FCN ("TUPLE" T)
  79. <OFF ,GC-HAND>
  80. <SETG DIVERT-AMT <SETG DIVERT-CNT 0>>>
  81. <SETG GC-HAND <HANDLER <SETG GC-INT <EVENT "GC" 11>>
  82. ,GC-FCN>>
  83. <OFF ,GC-HAND>
  84. <DEFINE XUNAME ()
  85. #DECL ((VALUE) STRING)
  86. <MAPF ,STRING
  87. <FUNCTION (X)
  88. #DECL ((X) CHARACTER)
  89. <COND (<OR <0? <ASCII .X>>
  90. <==? <ASCII .X> 32>>
  91. <MAPSTOP>)
  92. (T .X)>>
  93. <GXUNAME>>>
  94. <DEFINE ITS-GET-NAME (UNAME "AUX" (NM <FIELD .UNAME ,$NAME>) CMA JR LFST LLST
  95. TLEN TSTR STR)
  96. #DECL ((STR TSTR UNAME) STRING (NM CMA JR) <OR STRING FALSE>
  97. (TLEN LLST LFST) FIX)
  98. <COND (.NM
  99. <COND (<SET CMA <MEMQ !\, .NM>>
  100. <SET LLST <- <LENGTH .NM> <LENGTH .CMA>>>
  101. <SET CMA <REST .CMA>>
  102. <SET LFST <LENGTH .CMA>>
  103. <COND (<SET JR <MEMQ !\, .CMA>>
  104. <SET LFST <- .LFST <LENGTH .JR>>>)>
  105. <REPEAT ()
  106. <COND (<EMPTY? .CMA> <RETURN>)
  107. (<MEMQ <1 .CMA> %<STRING <ASCII 32> <ASCII 9>>>
  108. <SET CMA <REST .CMA>>
  109. <SET LFST <- .LFST 1>>)
  110. (ELSE <RETURN>)>>
  111. <SET TLEN <+ .LFST 1 .LLST <LENGTH .JR>>>
  112. <SET STR <ISTRING .TLEN !\ >>
  113. <SET TSTR .STR>
  114. <SUBSTRUC .CMA 0 .LFST .TSTR>
  115. <SET TSTR <REST .TSTR <+ .LFST 1>>>
  116. <SUBSTRUC .NM 0 .LLST .TSTR>
  117. <AND .JR <SUBSTRUC .JR 0 <LENGTH .JR> <REST .TSTR .LLST>>>
  118. <SETG USER-NAME .STR>)
  119. (ELSE <SETG USER-NAME .NM>)>)>>
  120. <DEFINE UNSPEAKABLE-CODE ("AUX" STR NSTR (LEN-I 0) (O <FIND-OBJ "PAPER">))
  121. #DECL ((O) OBJECT (NSTR STR) STRING (LEN-I) FIX)
  122. <SET STR <MEMQ !\/ <OREAD .O>>>
  123. <COND (<==? <1 <BACK .STR 2>> !\1>
  124. <SET STR <BACK .STR 2>>
  125. <SET LEN-I 1>)
  126. (<SET STR <BACK .STR 1>>)>
  127. <SET NSTR <REST <MEMQ !\/ <REST <MEMQ !\/ .STR>>> 3>>
  128. <STRING "There is an issue of US NEWS & DUNGEON REPORT dated "
  129. <SUBSTRUC .STR 0 <- <LENGTH .STR> <LENGTH .NSTR>>>
  130. " here.">>
  131. <DEFINE REMARKABLY-DISGUSTING-CODE ("AUX" (N <DSKDATE>))
  132. #DECL ((N) <PRIMTYPE WORD>)
  133. <STRING
  134. "This version created "
  135. <NTH ,MONTHS <CHTYPE <GETBITS .N <BITS 4 23>> FIX>>
  136. !\
  137. <UNPARSE <CHTYPE <GETBITS .N <BITS 5 18>> FIX>>
  138. !\.>>
  139. <DEFINE VERSION ()
  140. <TELL ,VERS>>
  141. <SETG PLAYED-TIME 0>
  142. <GDECL (PLAYED-TIME) FIX>
  143. <DEFINE GET-TIME ("AUX" (NOW <DSKDATE>) (THEN ,INTIME))
  144. #DECL ((NOW THEN) <PRIMTYPE WORD>)
  145. <+ <COND (<N==? <CHTYPE <GETBITS .NOW <BITS 18 18>> FIX>
  146. <CHTYPE <GETBITS .THEN <BITS 18 18>> FIX>>
  147. </ <- <+ <CHTYPE <GETBITS .NOW <BITS 18 0>> FIX>
  148. <* 24 7200>>
  149. <CHTYPE <GETBITS .THEN <BITS 18 0>> FIX>>
  150. 2>)
  151. (</ <- <CHTYPE <GETBITS .NOW <BITS 18 0>> FIX>
  152. <CHTYPE <GETBITS .THEN <BITS 18 0>> FIX>>
  153. 2>)>
  154. ,PLAYED-TIME>>
  155. <DEFINE PLAY-TIME ("OPTIONAL" (OUTCHAN ,OUTCHAN) (LOSER? T)
  156. "AUX" TIME MINS)
  157. #DECL ((MINS TIME) FIX (OUTCHAN) <SPECIAL CHANNEL> (LOSER?) <OR ATOM FALSE>)
  158. <SET TIME <GET-TIME>>
  159. <SETG TELL-FLAG T>
  160. <COND (.LOSER? <PRINC "You have been playing DUNGEON for ">)
  161. (T
  162. <PRINC "Played for ">)>
  163. <AND <G? <SET MINS </ .TIME 3600>> 0>
  164. <PRIN1 .MINS>
  165. <PRINC " hour">
  166. <OR <1? .MINS> <PRINC "s">>
  167. <PRINC ", ">>
  168. <COND (<G? <SET MINS <MOD </ .TIME 60> 60>> 0>
  169. <PRIN1 .MINS>
  170. <PRINC " minute">
  171. <COND (<NOT <1? .MINS>> <PRINC "s">)>
  172. <PRINC ", and ">)>
  173. <PRIN1 <SET MINS <MOD .TIME 60>>>
  174. <PRINC " second">
  175. <OR <1? .MINS> <PRINC "s">>
  176. <COND (.LOSER? <PRINC ".
  177. ">)
  178. (<PRINC ".">)>
  179. .TIME>
  180. <DEFINE PC () T>
  181. <DEFINE HANDLE (FRM "TUPLE" ZORK "AUX" ZF)
  182. #DECL ((ZF) ANY)
  183. <PUT ,OUTCHAN 13 80>
  184. <PUT <1 <BACK ,INCHAN>> 6 #LOSE 27>
  185. <COND (<AND <OR <NOT <GASSIGNED? XUNM>>
  186. <MEMBER ,XUNM ,WINNERS>>
  187. <PC>>
  188. <AND <GASSIGNED? SAVEREP> <SETG REP ,SAVEREP>>
  189. <AND <ASSIGNED? BH> <OFF .BH>>
  190. <INT-LEVEL 0>
  191. <SETG DBG T>
  192. <SETG ALT-FLAG T>)
  193. (T
  194. <COND (<AND <NOT <EMPTY? .ZORK>>
  195. <==? <1 .ZORK> CONTROL-G?!-ERRORS>>
  196. <INT-LEVEL 0>
  197. <FINISH>
  198. <PUT <1 <BACK ,INCHAN>> 6 <COND (<G? ,MUDDLE 100>
  199. <COND (,TENEX? #LOSE *37*)
  200. (T #LOSE *000000000012*)>)
  201. (T #LOSE *000000000015*)>>
  202. <ERRET T .FRM>)
  203. (<AND <==? <LENGTH .ZORK> 3>
  204. <==? <1 .ZORK> FILE-SYSTEM-ERROR!-ERRORS>
  205. <NOT <SET ZF <3 .ZORK>>>
  206. <==? <LENGTH .ZF> 3>
  207. <=? <1 .ZF>
  208. "ILLEGAL CHR AFTER CNTRL P ON TTY DISPLAY">>
  209. ; "HACK FOR ILLEGAL CHR AFTER CTRL-P"
  210. <PUT <1 <BACK ,INCHAN>> 6 #LOSE *000000000015*>
  211. <INT-LEVEL 0>
  212. <ERRET T .FRM>)
  213. (<TELL
  214. "I'm sorry, you seem to have encountered an error in the program.
  215. Send mail to DUNGEON@MIT-DMS describing what it was you tried to do.">
  216. <TELL ,VERS>
  217. <MAPF <> <FUNCTION (X) <PRINT .X>> .ZORK>
  218. <FINISH #FALSE (". Error.")>)>)>>
  219. <PSETG WINNERS '["BKD" "TAA" "MARC" "PDL" "MDL"]>
  220. <GDECL (WINNERS) <VECTOR [REST STRING]>>
  221. <OR <LOOKUP "COMPILE" <ROOT>>
  222. <LOOKUP "GLUE" <GET PACKAGE OBLIST>>
  223. <SETG ERRH
  224. <HANDLER <OR <GET ERROR!-INTERRUPTS INTERRUPT> <EVENT "ERROR" 8>>
  225. ,HANDLE>>>
  226. <GDECL (MOVES) FIX (SCRIPT-CHANNEL) <OR CHANNEL FALSE>>
  227. <DEFINE START (RM "OPTIONAL" (ST "") "AUX" FN (MUDDLE ,MUDDLE) (XUNM <XUNAME>))
  228. #DECL ((ST RM) STRING (MUDDLE) FIX (XUNM) STRING (FN) <OR FALSE STRING>)
  229. <SETG XUNM .XUNM>
  230. <SETG PTEMP <CHTYPE [<CHTYPE WITH!-WORDS PREP> <FIND-OBJ "!!!!!">] PHRASE>>
  231. <SETG INTIME <DSKDATE>>
  232. <COND (<L? .MUDDLE 100>
  233. <AND <G? <LENGTH .XUNM> 2> <=? <SUBSTRUC .XUNM 0 3> "___"> <QUIT>>
  234. <SET FN <ITS-GET-NAME .XUNM>>)
  235. (<SET FN <GET-NAME>>)>
  236. <COND (.FN
  237. <SETG USER-NAME .FN>)
  238. (<SETG USER-NAME .XUNM>)>
  239. <SETG DEATHS 0>
  240. <SETG MOVES 0>
  241. <SETG WINNER ,PLAYER>
  242. <PUT ,WINNER ,AROOM <SETG HERE <FIND-ROOM .RM>>>
  243. <TELL "Welcome to Dungeon.
  244. " 1 .ST>
  245. <RANDOM <CHTYPE <DSKDATE> FIX>>
  246. <INT-LEVEL 0>
  247. <CONTIN>>
  248. <DEFINE CONTIN ()
  249. <SETG ALT-FLAG <>>
  250. <PUT <1 <BACK ,INCHAN>> 6 <COND (<G? ,MUDDLE 100>
  251. <COND (,TENEX? #LOSE *37*)
  252. (T #LOSE *000000000012*)>)
  253. (T #LOSE *000000000015*)>>
  254. <SETG SAVEREP ,REP>
  255. <SETG REP ,RDCOM>
  256. <RESET ,INCHAN>
  257. <SETG WINNER ,PLAYER>
  258. <PUT ,PRSVEC 2 <>>
  259. ,NULL>
  260. <SETG MY-SCRIPT <>>
  261. <GDECL (MY-SCRIPT) <OR ATOM FALSE>>
  262. <DEFINE MAKE-SCRIPT ("AUX" CH)
  263. #DECL ((CH) <OR CHANNEL FALSE>)
  264. <COND (,SCRIPT-CHANNEL
  265. <>)
  266. (<SET CH <OPEN "PRINT" <STRING "MARC;%Z" ,XUNM " >">>>
  267. <PUT <TOP ,INCHAN> 1 (.CH)>
  268. <PUT <TOP ,OUTCHAN> 1 (.CH)>
  269. <SETG SCRIPT-CHANNEL .CH>
  270. <SETG MY-SCRIPT T>)>>
  271. <DEFINE FLUSH-ME ()
  272. <UNWIND
  273. <PROG ()
  274. <TELL
  275. "Suddenly, a sinister, wraithlike figure appears before you, seeming
  276. to float in the air. He glows with an eldritch light. In a barely
  277. audible voice he says, \"Begone, defiler! Your presence upsets the
  278. very balance of the System itself!\" With a sinister chuckle, he
  279. raises his oaken staff, taps you on the head, and fades into the
  280. gloom. In his place appears a tastefully lettered sign reading:
  281. DUNGEON CLOSED
  282. At that instant, you disappear, and all your belongings clatter to
  283. the ground.
  284. ">
  285. <FINISH <>>>
  286. <FINISH <>>>>
  287. <DEFINE DO-SCRIPT ("AUX" CH (UNM ,XUNM) (MUDDLE ,MUDDLE))
  288. #DECL ((CH) <OR CHANNEL FALSE> (UNM) STRING (MUDDLE) FIX)
  289. <COND (,MY-SCRIPT
  290. <DO-UNSCRIPT <>>)>
  291. <COND (,SCRIPT-CHANNEL
  292. <TELL "You are already scripting.">)
  293. (<AND
  294. <OR <G? .MUDDLE 100>
  295. <AND <NOT <MEMBER "GUEST" .UNM>>
  296. <SET CH <OPEN "READ" ".FILE." "(DIR)" "DSK" .UNM>>
  297. <CLOSE .CH>
  298. <SET CH <OPEN "READ" "_MSGS_" .UNM "DSK" .UNM>>
  299. <CLOSE .CH>>>
  300. <SET CH <OPEN "PRINT" "ZORK" "SCRIPT" "DSK" .UNM>>>
  301. <PUT <TOP ,INCHAN> 1 (.CH)>
  302. <PUT <TOP ,OUTCHAN> 1 (.CH)>
  303. <SETG SCRIPT-CHANNEL .CH>
  304. <COND (<L? ,MUDDLE 100>
  305. <TELL "Scripting to " 1 ,XUNM ";ZORK SCRIPT">)
  306. (T
  307. <TELL "Scripting to <" 1 ,XUNM ">ZORK.SCRIPT">)>)
  308. (T
  309. <TELL "I can't open the script channel.">)>>
  310. <DEFINE DO-UNSCRIPT ("OPTIONAL" (VERBOSE T))
  311. #DECL ((VERBOSE) <OR ATOM FALSE>)
  312. <COND (,SCRIPT-CHANNEL
  313. <PUT <TOP ,INCHAN> 1 ()>
  314. <PUT <TOP ,OUTCHAN> 1 ()>
  315. <CLOSE ,SCRIPT-CHANNEL>
  316. <SETG SCRIPT-CHANNEL <>>
  317. <AND .VERBOSE <TELL "Scripting off.">>)
  318. (<AND .VERBOSE <TELL "Scripting wasn't on.">>)>>
  319. <GDECL (THEN) FIX>
  320. <DEFINE DO-SAVE ("AUX" (MUDDLE ,MUDDLE) CH (UNM ,XUNM))
  321. #DECL ((CH) <OR CHANNEL FALSE> (MUDDLE) FIX (UNM) STRING)
  322. <COND (<OR <G? .MUDDLE 100>
  323. <AND <NOT <MEMBER "GUEST" .UNM>>
  324. <SET CH <OPEN "READ" ".FILE." "(DIR)" "DSK" .UNM>>
  325. <CLOSE .CH>>>
  326. <COND (<OR <G? .MUDDLE 100>
  327. <AND <SET CH <OPEN "READ" "_MSGS_" .UNM "DSK" .UNM>>
  328. <CLOSE .CH>>>
  329. <AND ,SCRIPT-CHANNEL <DO-UNSCRIPT>>
  330. <TELL "Saving.">
  331. <INT-LEVEL 100000>
  332. <OFF "CHAR" ,INCHAN>
  333. <SETG THEN <CHTYPE <DSKDATE> FIX>>
  334. <SETG PLAYED-TIME <GET-TIME>>
  335. <COND (<SET CH <OPEN "PRINTB"
  336. <COND (<L? .MUDDLE 100>
  337. <STRING "DSK:" .UNM ";ZORK SAVE">)
  338. (T
  339. <STRING "DSK:<" .UNM ">ZORK.SAVE">)>>>
  340. <SAVE-GAME .CH>
  341. <FINISH <CHTYPE '(". Saved.") FALSE>>)
  342. (<TELL "Save failed.">
  343. <TELL <1 .CH> 1 " " <2 .CH>>)>)
  344. (<TELL "Can't open channel for save.">)>)
  345. (T <TELL "Can't open channel for save.">)>>
  346. <DEFINE DO-RESTORE ("AUX" CH STR (MUDDLE ,MUDDLE) NOWD NOW THEND)
  347. #DECL ((CH) <OR CHANNEL FALSE> (STR) STRING (NOWD NOW THEND MUDDLE) FIX)
  348. <COND (<L? .MUDDLE 100>
  349. <SET STR <STRING "DSK:" ,XUNM ";ZORK SAVE">>)
  350. (T
  351. <SET STR <STRING "DSK:<" ,XUNM ">ZORK.SAVE">>)>
  352. <PROG ((FOO T) (SNM <SNAME>))
  353. #DECL ((FOO) <OR ATOM FALSE> (SNM) <SPECIAL STRING>)
  354. <COND (<SET CH <OPEN "READB" .STR>>
  355. <COND (<RESTORE-GAME .CH>
  356. <COND (<MEMBER ,XUNM ,WINNERS>)
  357. (<==? <SET NOWD
  358. <CHTYPE <GETBITS <SET NOW
  359. <CHTYPE <DSKDATE> FIX>>
  360. <BITS 18 18>>
  361. FIX>>
  362. <SET THEND
  363. <CHTYPE <GETBITS ,THEN <BITS 18 18>> FIX>>>
  364. <COND (<G=? <- .NOW ,THEN> 2400>)
  365. (<TELL "It's too soon.">
  366. <COND (<G? ,MUDDLE 100>
  367. <OFF "CHAR" ,INCHAN>
  368. <INT-LEVEL 10000>
  369. <QUIT>)>
  370. <QUIT>)>)
  371. (<1? <- .NOWD .THEND>>
  372. <COND (<G=? <- <+ <CHTYPE <GETBITS .NOW <BITS 18 0>> FIX>
  373. <* 24 7200>>
  374. <CHTYPE <GETBITS .NOW <BITS 18 0>> FIX>>
  375. 2400>)
  376. (<TELL "It's too soon.">
  377. <QUIT>)>)>
  378. <SETG INTIME .NOW>
  379. <TELL "Restored.">)
  380. (<TELL "Restore failed.">)>
  381. <ROOM-DESC>)
  382. (<AND .FOO <G? .MUDDLE 100>>
  383. <SET STR <STRING <SNAME> "ZORK.SAVE">>
  384. <SET FOO <>>
  385. <AGAIN>)
  386. (<TELL <2 .CH> 1 " " <1 .CH>>)>>>
  387. <DEFINE PROB (NUM) #DECL ((NUM) FIX) <L=? <MOD <RANDOM> 100> .NUM>>
  388. "GET-ATOM TAKES A VALUE AND SEARCHES INITIAL FOR FIRST ATOM
  389. SETG'ED TO THAT."
  390. <DEFINE GET-ATOM ACT (VAL "AUX" (O <GET INITIAL OBLIST>))
  391. #DECL ((O) OBLIST)
  392. <MAPF <>
  393. <FUNCTION (X) #DECL ((X) <LIST [REST ATOM]>)
  394. <MAPF <>
  395. <FUNCTION (X) #DECL ((X) ATOM)
  396. <COND (<AND <GASSIGNED? .X>
  397. <==? ,.X .VAL>>
  398. <RETURN .X .ACT>)>>
  399. .X>>
  400. .O>>
  401. ;
  402. "ROOM-INFO --
  403. PRINT SOMETHING ABOUT THIS PLACE
  404. 1. CHECK FOR LIGHT --> ELSE WARN LOSER
  405. 2. GIVE A DESCRIPTION OF THE ROOM
  406. 3. TELL WHAT'S ON THE FLOOR IN THE WAY OF OBJECTS
  407. 4. SIGNAL ENTRY INTO THE ROOM
  408. "
  409. <SETG BRIEF!-FLAG <>>
  410. <SETG SUPER-BRIEF!-FLAG <>>
  411. <GDECL (SUPER-BRIEF!-FLAG BRIEF!-FLAG) <OR ATOM FALSE>>
  412. <DEFINE BRIEF ()
  413. <SETG BRIEF!-FLAG T>
  414. <TELL "Brief descriptions.">>
  415. <DEFINE SUPER-BRIEF ()
  416. <SETG SUPER-BRIEF!-FLAG T>
  417. <TELL "No long descriptions.">>
  418. <DEFINE UN-BRIEF ()
  419. <SETG BRIEF!-FLAG <>>
  420. <SETG SUPER-BRIEF!-FLAG <>>
  421. <TELL "Long descriptions.">>
  422. <DEFINE UN-SUPER-BRIEF ()
  423. <SETG SUPER-BRIEF!-FLAG <>>
  424. <TELL "Some long descriptions.">>
  425. <DEFINE ROOM-DESC () <ROOM-INFO T>>
  426. <DEFINE ROOM-INFO ("OPTIONAL" (FULL <>)
  427. "AUX" (AV <AVEHICLE ,WINNER>) (RM ,HERE) (PRSO <2 ,PRSVEC>)
  428. (WINOBJ <FIND-OBJ "#####">) (OUTCHAN ,OUTCHAN) RA)
  429. #DECL ((RM) ROOM (WINOBJ) OBJECT (AV) <OR FALSE OBJECT> (OUTCHAN) CHANNEL
  430. (PRSO) <OR DIRECTION FALSE OBJECT> (FULL) <OR ATOM FALSE>)
  431. <SETG TELL-FLAG T>
  432. <AND <TYPE? .PRSO DIRECTION> <PUT ,PRSVEC 2 <>>>
  433. <PROG ()
  434. <COND (<N==? ,HERE <AROOM ,PLAYER>>
  435. <PUT ,PRSVEC 1 ,WALK-IN!-WORDS>
  436. <TELL "Done.">
  437. <RETURN>)
  438. (<AND .PRSO
  439. <TYPE? .PRSO OBJECT>>
  440. <COND (<OBJECT-ACTION>)
  441. (<OREAD .PRSO>
  442. <TELL <OREAD .PRSO>>)
  443. (<TELL "I see nothing special about the "
  444. 1
  445. <ODESC2 .PRSO>
  446. ".">)>
  447. <RETURN>)
  448. (<NOT <LIT? .RM>>
  449. <TELL
  450. "It is pitch black. You are likely to be eaten by a grue.">
  451. <RETURN <>>)
  452. (<OR <AND <NOT .FULL> ,SUPER-BRIEF!-FLAG>
  453. <AND <RSEEN? .RM>
  454. <OR ,BRIEF!-FLAG <PROB 80>>
  455. <NOT .FULL>>>
  456. <TELL <RDESC2 .RM>>)
  457. (<AND <EMPTY? <RDESC1 .RM>> <SET RA <RACTION .RM>>>
  458. <PUT ,PRSVEC 1 ,LOOK!-WORDS>
  459. <APPLY-RANDOM .RA>
  460. <PUT ,PRSVEC 1 ,FOO!-WORDS> ; "Something innocuous")
  461. (<TELL <RDESC1 .RM>>)>
  462. <PUT .RM ,RSEEN? T>
  463. <AND .AV <TELL "You are in the " 1 <ODESC2 .AV> ".">>
  464. <MAPF <>
  465. <FUNCTION (X)
  466. #DECL ((X) OBJECT)
  467. <COND
  468. (<AND <OVIS? .X> <DESCRIBABLE? .X>>
  469. <COND (<==? .X .AV>)
  470. (T
  471. <COND (<LONG-DESC-OBJ .X>
  472. <AND .AV <TELL " [in the room]" 0>>
  473. <CRLF>)>)>
  474. <COND (<TRNN .X ,ACTORBIT>
  475. <INVENT <ORAND .X>>)
  476. (<SEE-INSIDE? .X>
  477. <PRINT-CONT
  478. .X .AV .WINOBJ ,INDENTSTR <COND (.FULL)
  479. (,SUPER-BRIEF!-FLAG <>)
  480. (,BRIEF!-FLAG <>)
  481. (T)>>)>)>>
  482. <ROBJS .RM>>
  483. <COND (<AND <SET RA <RACTION .RM>>
  484. <NOT .FULL>>
  485. <PUT ,PRSVEC 1 ,WALK-IN!-WORDS>
  486. <APPLY-RANDOM .RA>
  487. <PUT ,PRSVEC 1 ,FOO!-WORDS>)>
  488. T>>
  489. <PSETG INDENTSTR <REST <ISTRING 8> 8>>
  490. <DEFINE PRINT-CONT PRINT-C (OBJ AV WINOBJ INDENT "OPTIONAL" (CASE? T)
  491. "AUX" (CONT <OCONTENTS .OBJ>))
  492. #DECL ((AV) <OR FALSE OBJECT> (OBJ WINOBJ) OBJECT (INDENT) STRING
  493. (CONT) <LIST [REST OBJECT]> (CASE?) <OR ATOM FALSE>)
  494. <COND (<NOT <EMPTY? .CONT>>
  495. <COND (<==? .OBJ <FIND-OBJ "TCASE">>
  496. <COND (<NOT .CASE?> <RETURN T .PRINT-C>)>
  497. <TELL "Your collection of treasures consists of:">)
  498. (<NOT <AND <==? <LENGTH .CONT> 1>
  499. <==? <1 .CONT> <FIND-OBJ "#####">>>>
  500. <TELL .INDENT 0>
  501. <TELL "The " 1 <ODESC2 .OBJ> " contains:">)
  502. (<RETURN T .PRINT-C>)>
  503. <MAPF <>
  504. <FUNCTION (Y)
  505. #DECL ((Y) OBJECT)
  506. <COND (<AND .AV <==? .Y .WINOBJ>>)
  507. (<AND <OVIS? .Y> <DESCRIBABLE? .Y> <NOT <EMPTY? <ODESC2 .Y>>>>
  508. <TELL .INDENT 1 " A " <ODESC2 .Y>>)>
  509. <COND (<SEE-INSIDE? .Y>
  510. <PRINT-CONT .Y .AV .WINOBJ <BACK .INDENT>>)>>
  511. <OCONTENTS .OBJ>>)>>
  512. "GIVE LONG DESCRIPTION OF OBJECT"
  513. <DEFINE LONG-DESC-OBJ (OBJ "AUX" STR)
  514. #DECL ((OBJ) OBJECT)
  515. <COND (<OR <OTOUCH? .OBJ> <NOT <ODESCO .OBJ>>>
  516. <SET STR <ODESC1 .OBJ>>)
  517. (<SET STR <ODESCO .OBJ>>)>
  518. <COND (<EMPTY? .STR> <>)
  519. (<TELL .STR 0>)>>
  520. "TRUE IF PARSER WON: OTHERWISE INHIBITS OBJECT ACTIONS, CLOCKS (BUT NOT THIEF)."
  521. <GDECL (PARSE-WON) <OR ATOM FALSE>>
  522. <PSETG READER-STRING <STRING <ASCII 27> <ASCII 13> <ASCII 10>>>
  523. <DEFINE RDCOM ("OPTIONAL" (IVEC <>)
  524. "AUX" (STR ,READER-STRING) VC RVEC RM (INPLEN 1) (INBUF ,INBUF)
  525. (WINNER ,WINNER) AV (OUTCHAN ,OUTCHAN) RANDOM-ACTION)
  526. #DECL ((RVEC) <OR FALSE VECTOR> (RM) ROOM (INPLEN) FIX (INBUF) STRING
  527. (WINNER) ADV (AV) <OR FALSE OBJECT> (OUTCHAN) CHANNEL
  528. (IVEC) <OR FALSE VECTOR> (VC) VECTOR)
  529. <OR .IVEC <PROG ()
  530. <PUT .OUTCHAN 13 1000>
  531. <ROOM-INFO T>>>
  532. <REPEAT (VVAL CV)
  533. #DECL ((CV) <OR FALSE VERB>)
  534. <SET VVAL T>
  535. <COND (<NOT .IVEC>
  536. <SET RM ,HERE>
  537. <PRINC ">">
  538. <SETG TELL-FLAG <>>
  539. <SET INPLEN <READSTRING .INBUF ,INCHAN .STR>>
  540. <READCHR ,INCHAN>
  541. <OR ,ALT-FLAG <READCHR ,INCHAN>>
  542. <SET VC <LEX .INBUF <REST .INBUF .INPLEN> T>>)>
  543. <COND (<G? .INPLEN 0>
  544. <SETG MOVES <+ ,MOVES 1>>
  545. <COND (<SETG PARSE-WON
  546. <AND <EPARSE <OR .IVEC .VC> <>>
  547. <TYPE? <SET CV <1 <SET RVEC ,PRSVEC>>> VERB>>>
  548. <COND (<NOT <SET RANDOM-ACTION <AACTION .WINNER>>>)
  549. (<APPLY-RANDOM .RANDOM-ACTION>
  550. <RETURN>)>
  551. <AND <SET AV <AVEHICLE .WINNER>>
  552. <SET RANDOM-ACTION <OACTION .AV>>
  553. <SET VVAL <NOT <APPLY-RANDOM .RANDOM-ACTION READ-IN>>>>
  554. <COND (<AND .VVAL <SET RANDOM-ACTION <VFCN .CV>>
  555. <APPLY-RANDOM .RANDOM-ACTION>>
  556. <COND (<AND <SET RANDOM-ACTION <RACTION <SET RM ,HERE>>>
  557. <APPLY-RANDOM .RANDOM-ACTION>>)>)>)
  558. (.IVEC
  559. <COND (,TELL-FLAG
  560. <TELL "Please input entire command again.">)
  561. (<TELL "Nothing happens.">)>
  562. <RETURN>)>
  563. <OR ,TELL-FLAG <TELL "Nothing happens.">>)
  564. (T <SETG PARSE-WON <>> <TELL "Beg pardon?">)>
  565. <MAPF <>
  566. <FUNCTION (X)
  567. #DECL ((X) HACK)
  568. <COND (<SET RANDOM-ACTION <HACTION .X>>
  569. <APPLY-RANDOM .RANDOM-ACTION .X>)>>
  570. ,DEMONS>
  571. <AND ,PARSE-WON
  572. <SET AV <AVEHICLE .WINNER>>
  573. <SET RANDOM-ACTION <OACTION .AV>>
  574. <APPLY-RANDOM .RANDOM-ACTION READ-OUT>>
  575. <AND .IVEC <RETURN>>>>
  576. <DEFINE SCORE-OBJ (OBJ "AUX" TEMP) #DECL ((OBJ) OBJECT)
  577. <COND (<G? <SET TEMP <OFVAL .OBJ>> 0>
  578. <SCORE-UPD .TEMP>
  579. <PUT .OBJ ,OFVAL 0>)>>
  580. <DEFINE SCORE-ROOM (RM "AUX" TEMP) #DECL ((RM) ROOM)
  581. <COND (<G? <SET TEMP <RVAL .RM>> 0>
  582. <SCORE-UPD .TEMP>
  583. <PUT .RM ,RVAL 0>)>>
  584. <DEFINE SCORE-UPD (NUM "AUX" (WINNER ,WINNER)) #DECL ((NUM) FIX)
  585. <PUT .WINNER ,ASCORE <+ <ASCORE .WINNER> .NUM>>
  586. <SETG RAW-SCORE <+ ,RAW-SCORE .NUM>>>
  587. <DEFINE SCORE ("OPTIONAL" (ASK? T) "AUX" SCOR (OUTCHAN .OUTCHAN) PCT)
  588. #DECL ((ASK?) <OR ATOM FALSE> (SCOR) FIX (OUTCHAN) CHANNEL (PCT) FLOAT)
  589. <SETG TELL-FLAG T>
  590. <CRLF>
  591. <COND (.ASK? <PRINC
  592. "Your score would be ">)
  593. (<PRINC "Your score is ">)>
  594. <PRIN1 <SET SCOR
  595. <ASCORE ,WINNER>>>
  596. <PRINC " [total of ">
  597. <PRIN1 ,SCORE-MAX>
  598. <PRINC " points], in ">
  599. <PRIN1 ,MOVES>
  600. <COND (<1? ,MOVES> <PRINC " move.">)
  601. (<PRINC " moves.">)>
  602. <CRLF>
  603. <PRINC "This score gives you the rank of ">
  604. <SET PCT </ <FLOAT .SCOR> <FLOAT ,SCORE-MAX>>>
  605. <PRINC <COND (<1? .PCT> "Cheater")
  606. (<G? .PCT 0.95000000> "Wizard")
  607. (<G? .PCT 0.89999999> "Master")
  608. (<G? .PCT 0.79999999> "Winner")
  609. (<G? .PCT 0.60000000> "Hacker")
  610. (<G? .PCT 0.39999999> "Adventurer")
  611. (<G? .PCT 0.19999999> "Junior Adventurer")
  612. (<G? .PCT 0.09999999> "Novice Adventurer")
  613. (<G? .PCT 0.04999999> "Amateur Adventurer")
  614. ("Beginner")>>
  615. <PRINC ".">
  616. <CRLF>
  617. .SCOR>
  618. <DEFINE FINISH ("OPTIONAL" (ASK? T) "AUX" SCOR)
  619. #DECL ((ASK?) <OR ATOM FALSE> (SCOR) FIX)
  620. <UNWIND
  621. <PROG ()
  622. <SET SCOR <SCORE .ASK?>>
  623. <COND (<OR <AND .ASK?
  624. <TELL
  625. "Do you wish to leave the game? (Y is affirmative): ">
  626. <YES/NO <>>>
  627. <NOT .ASK?>>
  628. <RECORD .SCOR ,MOVES ,DEATHS .ASK? ,HERE>
  629. <QUIT>)>>
  630. <QUIT>>>
  631. "PRINT OUT DESCRIPTION OF LOSSAGE: WHEN PLAYED, SCORE, # MOVES, ETC."
  632. <SETG RECORD-STRING <ISTRING 5>>
  633. <GDECL (RECORD-STRING) STRING>
  634. <PSETG RECORDER-STRING <STRING <ASCII 26> <ASCII 3> <ASCII 0>>>
  635. <DEFINE RECORD RECORD (SCORE MOVES DEATHS QUIT? LOC
  636. "AUX" (CH <>) (STR ,RECORD-STRING) FL (CT 0) (MUDDLE ,MUDDLE)
  637. (DEV <VALUE DEV>) (SNM <VALUE SNM>))
  638. #DECL ((MUDDLE SCORE MOVES DEATHS) FIX (QUIT?) <OR ATOM FALSE> (LOC) ROOM
  639. (CH) <OR <CHANNEL FIX> FALSE> (STR) STRING (CT FL) FIX
  640. (DEV SNM) STRING)
  641. <UNWIND
  642. <PROG ()
  643. <PROG ()
  644. <COND (<SET CH <OPEN "READB" "ZORK" "LOG" .DEV .SNM>>
  645. <COND (<G=? <SET FL <FILE-LENGTH .CH>> 1>
  646. <ACCESS .CH <- .FL 1>>
  647. <SET CT <READSTRING .STR .CH ,RECORDER-STRING>>)>
  648. <CLOSE .CH>
  649. <COND (<SET CH <OPEN "PRINTO" "ZORK" "LOG" .DEV .SNM>>)
  650. (<AND <G? .MUDDLE 100> <==? <3 .CH> *600123*>>
  651. ; "Can't win--no write access"
  652. <RETURN T .RECORD>)
  653. (T <SLEEP 1> <AGAIN>)>
  654. <ACCESS .CH <MAX 0 <- .FL 1>>>
  655. <PRINTSTRING .STR .CH .CT>)
  656. (<OR <AND <L? .MUDDLE 100> <N==? <3 .CH> *4000000*>>
  657. <AND <G? .MUDDLE 100> <==? <3 .CH> *600130*>>>
  658. ;"on 10x, must get FILE BUSY to try again"
  659. <SLEEP 1>
  660. <AGAIN>)
  661. (<SET CH <OPEN "PRINT" "ZORK" "LOG" .DEV .SNM>>)
  662. (<AND <G? .MUDDLE 100> <==? <3 .CH> *600117*>>
  663. ; "No write access"
  664. <RETURN T .RECORD>)
  665. (<RETURN T .RECORD>)>>
  666. <CRLF .CH>
  667. <PRINC " " .CH>
  668. <PRINC ,USER-NAME .CH>
  669. <COND (<N=? ,USER-NAME ,XUNM>
  670. <PRINC " (" .CH>
  671. <PRINC ,XUNM .CH>
  672. <PRINC !\) .CH>)>
  673. <PRINC " " .CH>
  674. <PDSKDATE <DSKDATE> .CH>
  675. <CRLF .CH>
  676. <PLAY-TIME .CH <>>
  677. <CRLF .CH>
  678. <PRIN1 .SCORE .CH>
  679. <PRINC !\/ .CH>
  680. <PRIN1 ,SCORE-MAX .CH>
  681. <PRINC " points, " .CH>
  682. <PRIN1 .MOVES .CH>
  683. <PRINC " moves, " .CH>
  684. <PRIN1 .DEATHS .CH>
  685. <PRINC " death" .CH>
  686. <COND (<1? .DEATHS> <PRINC "." .CH>)
  687. (T <PRINC "s." .CH>)>
  688. <PRINC " In " .CH>
  689. <PRINC <RDESC2 .LOC> .CH>
  690. <COND (.QUIT? <PRINC ". Quit." .CH>)
  691. (<EMPTY? .QUIT?> <PRINC ". Died." .CH>)
  692. (<PRINC <1 .QUIT?> .CH>)>
  693. <CRLF .CH>
  694. <MAPF <>
  695. <FUNCTION (X Y)
  696. #DECL ((X) ATOM (Y) STRING)
  697. <COND (,.X <PRINC "/" .CH> <PRINC .Y .CH>)>>
  698. ,FLAG-NAMES
  699. ,SHORT-NAMES>
  700. <MAPF <>
  701. <FUNCTION (X Y)
  702. #DECL ((X) ATOM (Y) STRING)
  703. <COND (<0? ,.X> <PRINC "/" .CH> <PRINC .Y .CH>)>>
  704. ,VAL-NAMES
  705. ,SHORT-VAL-NAMES>
  706. <CRLF .CH>
  707. <CLOSE .CH>>
  708. <AND .CH <NOT <0? <1 .CH>>> <CLOSE .CH>>>>
  709. FLAG-NAMES
  710. <GDECL (FLAG-NAMES VAL-NAMES)
  711. <UVECTOR [REST ATOM]>
  712. (SHORT-NAMES SHORT-VAL-NAMES)
  713. <VECTOR [REST STRING]>>
  714. <BLOCK (<OR <GET FLAG OBLIST> <MOBLIST FLAG>> <GET INITIAL OBLIST> <ROOT>)>
  715. <PSETG FLAG-NAMES
  716. <UVECTOR KITCHEN-WINDOW
  717. TROLL-FLAG
  718. KEY-FLAG
  719. LOW-TIDE
  720. DOME-FLAG
  721. GLACIER-FLAG
  722. ECHO-FLAG
  723. RIDDLE-FLAG
  724. LLD-FLAG
  725. CYCLOPS-FLAG
  726. MAGIC-FLAG
  727. RAINBOW
  728. GNOME-DOOR
  729. CAROUSEL-FLIP
  730. CAGE-SOLVE>>
  731. <ENDBLOCK>
  732. <PSETG SHORT-NAMES
  733. <VECTOR "KI" "TR" "KE" "LO" "DO" "GL" "EC"
  734. "RI" "LL" "CY" "MA" "RA" "GN" "CA" "CG">>
  735. <PSETG VAL-NAMES <UVECTOR LIGHT-SHAFT>>
  736. <PSETG SHORT-VAL-NAMES <VECTOR "LI">>
  737. <DEFINE PDSKDATE (WD CH
  738. "AUX" (TIM <CHTYPE <GETBITS .WD <BITS 18 0>> FIX>) (A/P " AM")
  739. HR)
  740. #DECL ((WD) <PRIMTYPE WORD> (TIM HR) FIX (A/P) STRING (CH) CHANNEL)
  741. <PRINC " " .CH>
  742. <COND (<0? <CHTYPE .WD FIX>> <PRINC "unknown " .CH>)
  743. (T
  744. <PRINC <NTH ,MONTHS <CHTYPE <GETBITS .WD <BITS 4 23>> FIX>> .CH>
  745. <PRINC " " .CH>
  746. <PRIN1 <CHTYPE <GETBITS .WD <BITS 5 18>> FIX> .CH>
  747. <PRINC " at " .CH>
  748. <SET HR </ .TIM 7200>>
  749. <COND (<G=? .HR 12> <SET HR <- .HR 12>> <SET A/P " PM">)>
  750. <COND (<0? .HR> <SET HR 12>)>
  751. <PRIN1 .HR .CH>
  752. <PRINC ":" .CH>
  753. <SET HR </ <MOD .TIM 7200> 120>>
  754. <COND (<L? .HR 10> <PRINC "0" .CH>)>
  755. <PRIN1 .HR .CH>
  756. <PRINC .A/P .CH>)>>
  757. <PSETG MONTHS
  758. ["January"
  759. "February"
  760. "March"
  761. "April"
  762. "May"
  763. "June"
  764. "July"
  765. "August"
  766. "September"
  767. "October"
  768. "November"
  769. "December"]>
  770. <GDECL (MONTHS) <VECTOR [12 STRING]>>
  771. <DEFINE JIGS-UP (DESC
  772. "AUX" (WINNER ,WINNER) (DEATHS ,DEATHS) (AOBJS <AOBJS .WINNER>)
  773. (RANDOM-LIST ,RANDOM-LIST) (LAMP <FIND-OBJ "LAMP">)
  774. LAMP-LOCATION (VAL-LIST ()) LC)
  775. #DECL ((DESC) STRING (DEATHS) FIX (AOBJS) <LIST [REST OBJECT]>
  776. (VAL-LIST) <LIST [REST OBJECT]> (LAMP-LOCATION) <OR FALSE ROOM>
  777. (WINNER) ADV (RANDOM-LIST) <LIST [REST ROOM]> (LAMP) OBJECT)
  778. <COND
  779. (,DBG
  780. <TELL .DESC>)
  781. (<UNWIND
  782. <PROG ()
  783. <COND (<N==? .WINNER ,PLAYER>
  784. <TELL .DESC>
  785. <TELL "The " 1 <ODESC2 <AOBJ .WINNER>> " has died.">
  786. <REMOVE-OBJECT <AOBJ .WINNER>>
  787. <PUT .WINNER ,AROOM <FIND-ROOM "FCHMP">>
  788. <RETURN>)>
  789. <RESET ,INCHAN>
  790. <SCORE-UPD -10>
  791. <PUT .WINNER ,AVEHICLE <>>
  792. <COND (<G=? .DEATHS 2>
  793. <TELL .DESC>
  794. <TELL
  795. "You clearly are a suicidal maniac. We don't allow psychotics in the
  796. cave, since they may harm other adventurers. Your remains will
  797. installed in the Land of the Living Dead, where your fellow adventurers
  798. may gloat over them.">
  799. <FINISH <>>)
  800. (<SETG DEATHS <+ .DEATHS 1>>
  801. <TELL .DESC>
  802. <TELL "Do you want me to try to patch you?" 0>
  803. <COND (<NOT <YES/NO T>>
  804. <TELL
  805. "What? You don't trust me? Why, only last week I patched a running ITS
  806. and it survived for over 30 seconds. Oh, well." 2>
  807. <FINISH <>>)
  808. (T
  809. <TELL
  810. "Now, let me see...
  811. Well, we weren't quite able to restore your state. You can't have
  812. everything.">
  813. <COND (<SET LAMP-LOCATION <OROOM .LAMP>>
  814. <PUT .WINNER ,AOBJS (.LAMP !.AOBJS)>
  815. <COND (<MEMQ .LAMP <ROBJS .LAMP-LOCATION>>
  816. <REMOVE-OBJECT .LAMP>)
  817. (<SET LC <OCAN .LAMP>>
  818. <PUT .LC
  819. ,OCONTENTS
  820. <SPLICE-OUT .LAMP <OCONTENTS .LC>>>
  821. <PUT .LAMP ,OROOM <>>
  822. <PUT .LAMP ,OCAN <>>)>)
  823. (<MEMQ .LAMP .AOBJS>
  824. <PUT .WINNER ,AOBJS (.LAMP !<SPLICE-OUT .LAMP .AOBJS>)>)>
  825. <PUT <FIND-OBJ "DOOR"> ,OTOUCH? <>>
  826. <GOTO <FIND-ROOM "FORE1">>
  827. <SETG EGYPT-FLAG!-FLAG T>
  828. <SET VAL-LIST <ROB-ADV .WINNER .VAL-LIST>>
  829. <MAPF <>
  830. <FUNCTION (X Y)
  831. #DECL ((X) OBJECT (Y) ROOM)
  832. <INSERT-OBJECT .X .Y>>
  833. <SET AOBJS <AOBJS .WINNER>>
  834. .RANDOM-LIST>
  835. <COND (<G=? <LENGTH .RANDOM-LIST> <LENGTH .AOBJS>>
  836. <SET AOBJS .VAL-LIST>)
  837. (<EMPTY? .VAL-LIST>
  838. <SET AOBJS <REST .AOBJS <LENGTH .RANDOM-LIST>>>)
  839. (T
  840. <PUTREST <REST .VAL-LIST <- <LENGTH .VAL-LIST> 1>>
  841. <REST .AOBJS <LENGTH .RANDOM-LIST>>>
  842. <SET AOBJS .VAL-LIST>)>
  843. <MAPF <>
  844. <FUNCTION (X Y)
  845. #DECL ((X) OBJECT (Y) ROOM)
  846. <INSERT-OBJECT .X .Y>>
  847. .AOBJS
  848. ,ROOMS>
  849. <PUT .WINNER ,AOBJS ()>
  850. T)>)>>
  851. <PROG ()
  852. <RECORD <SCORE <>> ,MOVES ,DEATHS <> ,HERE>
  853. <QUIT>>>)>>
  854. <DEFINE INFO () <FILE-TO-TTY "MADADV" "INFO">>
  855. <DEFINE HELP () <FILE-TO-TTY "MADADV" "HELP">>
  856. <PSETG BREAKS <STRING <ASCII 3> <ASCII 0>>>
  857. <DEFINE FILE-TO-TTY (FILE1 FILE2 "OPTIONAL" (DEV <VALUE DEV>) (SNM <VALUE SNM>)
  858. "AUX" (CH <OPEN "READ" .FILE1 .FILE2 .DEV .SNM>)
  859. LEN
  860. (BUF ,INBUF) (BUFLEN <LENGTH .BUF>)
  861. ITER)
  862. #DECL ((BUF FILE1 FILE2 DEV SNM) STRING (CH) <OR CHANNEL FALSE>
  863. (ITER LEN BUFLEN) FIX)
  864. <COND (.CH
  865. <UNWIND
  866. <PROG ()
  867. <SET LEN <FILE-LENGTH .CH>>
  868. <SET ITER </ .LEN .BUFLEN>>
  869. <OR <0? <MOD .LEN .BUFLEN>> <SET ITER <+ .ITER 1>>>
  870. <CRLF ,OUTCHAN>
  871. <SETG TELL-FLAG T>
  872. <REPEAT (SLEN)
  873. #DECL ((SLEN) FIX)
  874. <COND (<1? .ITER>
  875. <SET SLEN <READSTRING .BUF .CH ,BREAKS>>)
  876. (<SET SLEN <READSTRING .BUF .CH .BUFLEN>>)>
  877. <PRINTSTRING .BUF ,OUTCHAN .SLEN>
  878. <COND (<0? <SET ITER <- .ITER 1>>>
  879. <CRLF ,OUTCHAN>
  880. <RETURN <CLOSE .CH>>)>>>
  881. <CLOSE .CH>>)
  882. (<TELL "File not found.">)>>
  883. <DEFINE INVENT ("OPTIONAL" (WIN ,WINNER) "AUX" (ANY <>) (OUTCHAN ,OUTCHAN))
  884. #DECL ((ANY) <OR ATOM FALSE> (OUTCHAN) CHANNEL (WIN) ADV)
  885. <MAPF <>
  886. <FUNCTION (X)
  887. #DECL ((X) OBJECT)
  888. <COND (<OVIS? .X>
  889. <OR .ANY <PROG ()
  890. <COND (<==? .WIN ,PLAYER>
  891. <TELL "You are carrying:">)
  892. (<TELL "The "
  893. 1
  894. <ODESC2 <AOBJ .WIN>>
  895. " is carrying:">)>
  896. <SET ANY T>>>
  897. <TELL "A " 0 <ODESC2 .X>>
  898. <COND (<OR <EMPTY? <OCONTENTS .X>> <NOT <SEE-INSIDE? .X>>>)
  899. (<TELL " with " 0>
  900. <PRINT-CONTENTS <OCONTENTS .X>>)>
  901. <CRLF>)>>
  902. <AOBJS .WIN>>
  903. <OR .ANY <N==? .WIN ,PLAYER> <TELL "You are empty handed.">>>
  904. <DEFINE PRINT-CONTENTS (OLST "AUX" (OUTCHAN ,OUTCHAN))
  905. #DECL ((OLST) <LIST [REST OBJECT]> (OUTCHAN) CHANNEL)
  906. <MAPR <>
  907. <FUNCTION (Y)
  908. #DECL ((Y) <LIST [REST OBJECT]>)
  909. <PRINC "a ">
  910. <PRINC <ODESC2 <1 .Y>>>
  911. <COND (<G? <LENGTH .Y> 2>
  912. <PRINC ", ">)
  913. (<==? <LENGTH .Y> 2>
  914. <PRINC ", and ">)>>
  915. .OLST>>
  916. ;"LIT? --
  917. IS THERE ANY LIGHT SOURCE IN THIS ROOM"
  918. <DEFINE LIT? (RM "AUX" (WIN ,WINNER))
  919. #DECL ((RM) ROOM (WIN) ADV)
  920. <OR <RLIGHT? .RM>
  921. <LFCN <ROBJS .RM>>
  922. <LFCN <AOBJS .WIN>>
  923. <AND <N==? .WIN ,PLAYER>
  924. <==? ,HERE <AROOM ,PLAYER>>
  925. <LFCN <AOBJS ,PLAYER>>>>>
  926. <DEFINE LFCN LFCN (L "AUX" Y)
  927. #DECL ((L) <LIST [REST OBJECT]> (Y) ADV)
  928. <MAPF <>
  929. <FUNCTION (X)
  930. #DECL ((X) OBJECT)
  931. <AND <G? <OLIGHT? .X> 0> <MAPLEAVE T>>
  932. <COND (<AND <OVIS? .X>
  933. <OR <OOPEN? .X>
  934. <TRANSPARENT? .X>>>
  935. <MAPF <>
  936. <FUNCTION (X) #DECL ((X) OBJECT)
  937. <COND (<G? <OLIGHT? .X> 0>
  938. <RETURN T .LFCN>)>>
  939. <OCONTENTS .X>>)>
  940. <COND (<AND <TRNN .X ,ACTORBIT>
  941. <LFCN <AOBJS <SET Y <ORAND .X>>>>>
  942. <MAPLEAVE T>)>>
  943. .L>>
  944. ;"WALK --
  945. GIVEN A DIRECTION, WILL ATTEMPT TO WALK THERE"
  946. <DEFINE WALK ("AUX" LEAVINGS NRM (WHERE <CHTYPE <2 ,PRSVEC> ATOM>) (ME ,WINNER)
  947. (RM <1 .ME>) NL RANDOM-ACTION CXS)
  948. #DECL ((WHERE) ATOM (ME) ADV (RM) ROOM (LEAVINGS) <OR ATOM ROOM CEXIT NEXIT>
  949. (NRM) <OR FALSE
  950. <<PRIMTYPE VECTOR> [REST ATOM <OR ROOM NEXIT CEXIT>]>>
  951. (NL) <OR ATOM ROOM FALSE>)
  952. <COND (<AND <==? .ME ,PLAYER> <NOT <LIT? .RM>> <PROB 75>>
  953. <COND (<SET NRM <MEMQ .WHERE <REXITS .RM>>>
  954. <SET LEAVINGS <2 .NRM>>
  955. <COND (<AND <TYPE? .LEAVINGS ROOM> <LIT? .LEAVINGS>>
  956. <AND <GOTO .LEAVINGS> <ROOM-INFO <>>>)
  957. (<AND <TYPE? .LEAVINGS CEXIT>
  958. <SET LEAVINGS
  959. <COND (<AND <SET RANDOM-ACTION
  960. <CXACTION .LEAVINGS>>
  961. <APPLY-RANDOM .RANDOM-ACTION>>)
  962. (,<CXFLAG .LEAVINGS>
  963. <CXROOM .LEAVINGS>)>>
  964. <LIT? .LEAVINGS>>
  965. <OR <TYPE? .LEAVINGS ATOM>
  966. <AND <GOTO .LEAVINGS> <ROOM-INFO <>>>>)
  967. (<JIGS-UP
  968. "Oh, no! A fearsome grue slithered into the room and devoured you.">)>)
  969. (<JIGS-UP
  970. "Oh, no! You walked into the slavering fangs of a lurking grue.">)>)
  971. (<SET NRM <MEMQ .WHERE <REXITS .RM>>>
  972. <SET LEAVINGS <2 .NRM>>
  973. <COND (<TYPE? .LEAVINGS ROOM> <AND <GOTO .LEAVINGS> <ROOM-INFO <>>>)
  974. (<TYPE? .LEAVINGS CEXIT>
  975. <COND (<OR <AND <SET RANDOM-ACTION <CXACTION .LEAVINGS>>
  976. <SET NL <APPLY-RANDOM .RANDOM-ACTION>>>
  977. <AND ,<CXFLAG .LEAVINGS>
  978. <SET NL <CXROOM .LEAVINGS>>>>
  979. <OR <TYPE? .NL ATOM> <AND <GOTO .NL> <ROOM-INFO <>>>>)
  980. (<SET CXS <CXSTR .LEAVINGS>>
  981. <OR <EMPTY? .CXS>
  982. <TELL .CXS>>)
  983. (<TELL "There is no way to go in that direction.">)>)
  984. (T <TELL .LEAVINGS>)>)
  985. (<TELL "There is no way to go in that direction.">)>>
  986. <DEFINE TAKE ("OPTIONAL" (TAKE? T)
  987. "AUX" (WIN ,WINNER) (VEC ,PRSVEC) (RM <AROOM .WIN>) NOBJ
  988. (OBJ <2 .VEC>) (GETTER? <>) (ROBJS <ROBJS .RM>)
  989. (AOBJS <AOBJS .WIN>) (LOAD-MAX ,LOAD-MAX))
  990. #DECL ((WIN) ADV (VEC) VECTOR (OBJ NOBJ) OBJECT (RM) ROOM
  991. (GETTER? TAKE?) <OR ATOM FALSE> (LOAD-MAX) FIX
  992. (ROBJS AOBJS) <LIST [REST OBJECT]>)
  993. <PROG ()
  994. <COND (<TRNN .OBJ ,NO-CHECK-BIT>
  995. <RETURN <OBJECT-ACTION>>)>
  996. <COND (<OCAN .OBJ>
  997. <SET NOBJ <OCAN .OBJ>>
  998. <COND (<SEE-INSIDE? .NOBJ>
  999. <COND (<OOPEN? .NOBJ> <SET GETTER? T>)
  1000. (<TELL "I can't reach that."> <RETURN <>>)>)
  1001. (<TELL "I can't see one here."> <RETURN <>>)>)>
  1002. <COND
  1003. (<==? .OBJ <AVEHICLE .WIN>>
  1004. <TELL "You are in it, loser!">
  1005. <RETURN <>>)
  1006. (<NOT <CAN-TAKE? .OBJ>>
  1007. <OR <APPLY-OBJECT .OBJ> <TELL <PICK-ONE ,YUKS>>>
  1008. <RETURN <>>)
  1009. (<OR .GETTER? <MEMQ .OBJ .ROBJS>>
  1010. <SET LOAD-MAX <+ .LOAD-MAX <FIX <* </ 1.0 .LOAD-MAX> <ASTRENGTH .WIN>>>>>
  1011. <COND (<AND .GETTER? <MEMQ .NOBJ .AOBJS>>)
  1012. (<G? <+ <WEIGHT .AOBJS> <WEIGHT <OCONTENTS .OBJ>> <OSIZE .OBJ>>
  1013. .LOAD-MAX>
  1014. <TELL
  1015. "Your load is too heavy. You will have to leave something behind.">
  1016. <RETURN <>>)>
  1017. <COND (<NOT <APPLY-OBJECT .OBJ>>
  1018. <COND (.GETTER?
  1019. <PUT .NOBJ
  1020. ,OCONTENTS
  1021. <SPLICE-OUT .OBJ <OCONTENTS .NOBJ>>>
  1022. <PUT .OBJ ,OROOM <>>
  1023. <PUT .OBJ ,OCAN <>>)
  1024. (<REMOVE-OBJECT .OBJ>)>
  1025. <PUT .WIN ,AOBJS (.OBJ !.AOBJS)>
  1026. <PUT .OBJ ,OTOUCH? T>
  1027. <SCORE-OBJ .OBJ>
  1028. <COND (.TAKE? <TELL "Taken.">) (T)>)
  1029. (T)>)
  1030. (<MEMQ .OBJ .AOBJS> <TELL "You already have it.">)
  1031. (<TELL "I can't see one here."> <>)>>>
  1032. <DEFINE PUTTER ("OPTIONAL" (OBJACT T)
  1033. "AUX" (PV ,PRSVEC) (OBJO <2 .PV>) (OBJI <3 .PV>) (WIN ,WINNER)
  1034. (AOBJS <AOBJS .WIN>) CROCK CAN (ROBJS <ROBJS ,HERE>)
  1035. (OCAN <>))
  1036. #DECL ((PV) <VECTOR [3 ANY]> (OBJO OBJI) OBJECT (WIN) ADV
  1037. (AOBJS ROBJS) <LIST [REST OBJECT]> (CROCK CAN) OBJECT
  1038. (OCAN) <OR FALSE OBJECT> (OBJACT) <OR ATOM FALSE>)
  1039. <PROG ()
  1040. <COND (<TRNN .OBJO ,NO-CHECK-BIT>
  1041. <RETURN <OBJECT-ACTION>>)>
  1042. <COND (<OR <MEMQ .OBJO ,STARS>
  1043. <MEMQ .OBJI ,STARS>>
  1044. <TELL "Nice try.">
  1045. <RETURN <>>)>
  1046. <COND (<OR <OOPEN? .OBJI>
  1047. <OPENABLE? .OBJI>
  1048. <TRNN .OBJI ,VEHBIT>>
  1049. <SET CAN .OBJI>
  1050. <SET CROCK .OBJO>)
  1051. (<TELL "I can't do that."> <RETURN <>>)>
  1052. <COND (<NOT <OOPEN? .CAN>>
  1053. <TELL "I can't reach inside.">
  1054. <RETURN <>>)
  1055. (<==? .CAN .CROCK>
  1056. <TELL "How can you do that?">
  1057. <RETURN <>>)
  1058. (<G? <+ <WEIGHT <OCONTENTS .CAN>> <OSIZE .CROCK>>
  1059. <OCAPAC .CAN>>
  1060. <TELL "It won't fit.">
  1061. <RETURN <>>)>
  1062. <COND (<OR <MEMQ .CROCK .ROBJS>
  1063. <AND <SET OCAN <OCAN .CROCK>>
  1064. <MEMQ .OCAN .ROBJS>>
  1065. <AND .OCAN
  1066. <SET OCAN <OCAN .OCAN>>
  1067. <MEMQ .OCAN .ROBJS>>>
  1068. <PUT .PV 1 ,TAKE!-WORDS>
  1069. <PUT .PV 2 .CROCK>
  1070. <PUT .PV 3 <>>
  1071. <COND (<NOT <TAKE <>>> <RETURN <>>)
  1072. (<SET AOBJS <AOBJS .WIN>>)>)
  1073. (<SET OCAN <OCAN .CROCK>>
  1074. <COND (<OOPEN? .OCAN>
  1075. <PUT .WIN ,AOBJS <SET AOBJS (.CROCK !.AOBJS)>>
  1076. <PUT .OCAN
  1077. ,OCONTENTS
  1078. <SPLICE-OUT .CROCK <OCONTENTS .OCAN>>>
  1079. <PUT .CROCK ,OCAN <>>)
  1080. (<TELL "I can't reach the " 1 <ODESC2 .CROCK>>
  1081. <RETURN <>>)>)>
  1082. <PUT .PV 1 ,PUT!-WORDS>
  1083. <PUT .PV 2 .CROCK>
  1084. <PUT .PV 3 .CAN>
  1085. <COND (<AND .OBJACT <OBJECT-ACTION>> <RETURN>)
  1086. (<PUT .WIN ,AOBJS <SPLICE-OUT .CROCK .AOBJS>>
  1087. <PUT .CAN ,OCONTENTS (.CROCK !<OCONTENTS .CAN>)>
  1088. <PUT .CROCK ,OCAN .CAN>
  1089. <PUT .CROCK ,OROOM ,HERE>
  1090. <TELL "Done.">)>>>
  1091. <DEFINE DROPPER ("AUX" (WINNER ,WINNER) (AV <AVEHICLE .WINNER>)
  1092. (AOBJS <AOBJS .WINNER>) (GETTER? <>) (VEC ,PRSVEC)
  1093. (RM <AROOM .WINNER>) (OBJ <2 .VEC>) (PI <3 .VEC>) NOBJ)
  1094. #DECL ((VEC) <VECTOR VERB OBJECT <OR FALSE OBJECT>>
  1095. (OBJ NOBJ) OBJECT (PI AV) <OR FALSE OBJECT>
  1096. (RM) ROOM (GETTER?) <OR ATOM FALSE>)
  1097. <PROG ()
  1098. <COND (<AND <MEMQ <VNAME <1 .VEC>> '[DROP!-WORDS POUR!-WORDS]>
  1099. .PI>
  1100. <PUT .VEC 1 ,PUT!-WORDS>
  1101. <RETURN <PUTTER>>)
  1102. (<AND .PI
  1103. <NOT <OR <MEMQ .OBJ .AOBJS>
  1104. <MEMQ <OCAN .OBJ> .AOBJS>>>>
  1105. <PUT .VEC 2 .PI>
  1106. <PUT .VEC 3 .OBJ>
  1107. <SET OBJ <2 .VEC>>)>
  1108. <COND (<TRNN .OBJ ,NO-CHECK-BIT>
  1109. <RETURN <OBJECT-ACTION>>)>
  1110. <COND (<AND <OCAN .OBJ> <SET NOBJ <OCAN .OBJ>> <MEMQ .NOBJ .AOBJS>>
  1111. <COND (<OOPEN? .NOBJ> <SET GETTER? T>)
  1112. (<TRANSPARENT? .NOBJ>
  1113. <TELL "I can't reach that.">
  1114. <RETURN>)
  1115. (<TELL "I can't see that here.">)>)>
  1116. <COND (<OR .GETTER? <MEMQ .OBJ .AOBJS>>
  1117. <COND (.AV)
  1118. (.GETTER?
  1119. <PUT .NOBJ
  1120. ,OCONTENTS
  1121. <SPLICE-OUT .OBJ <OCONTENTS .NOBJ>>>
  1122. <PUT .OBJ ,OCAN <>>)
  1123. (<PUT .WINNER ,AOBJS <SPLICE-OUT .OBJ .AOBJS>>)>
  1124. <COND (.AV <PUT .VEC 2 .OBJ> <PUT .VEC 3 .AV> <PUTTER <>>)
  1125. (<INSERT-OBJECT .OBJ .RM>)>
  1126. <COND (<OBJECT-ACTION>)
  1127. (<==? <VNAME <1 .VEC>> DROP!-WORDS>
  1128. <TELL "Dropped.">)
  1129. (<==? <VNAME <1 .VEC>> THROW!-WORDS>
  1130. <TELL "Thrown.">)>)
  1131. (<TELL "You are not carrying that.">)>>>
  1132. "STUFF FOR 'EVERYTHING' AND 'VALUABLES'"
  1133. <SETG OBJ-UV <CHUTYPE <REST <IUVECTOR 20> 20> OBJECT>>
  1134. <GDECL (OBJ-UV) <UVECTOR [REST OBJECT]>>
  1135. <DEFINE FROB-LOTS (UV "AUX" (PRSVEC ,PRSVEC) (PA <1 .PRSVEC>) (RA <VFCN .PA>) PI
  1136. (WINNER ,WINNER) (HERE ,HERE))
  1137. #DECL ((UV) <UVECTOR [REST OBJECT]> (PRSVEC) <VECTOR VERB [2 ANY]>
  1138. (PA) VERB (RA) RAPPLIC (PI) <OR OBJECT FALSE> (WINNER) ADV (HERE) ROOM)
  1139. <COND (<==? .PA ,TAKE!-WORDS>
  1140. <MAPF <>
  1141. <FUNCTION (X) #DECL ((X) OBJECT)
  1142. <COND (<OR <CAN-TAKE? .X>
  1143. <TRNN .X ,TRYTAKEBIT>>
  1144. <PUT .PRSVEC 2 .X>
  1145. <TELL <ODESC2 .X> 0 ": ">
  1146. <APPLY-RANDOM .RA>
  1147. <COND (<N==? .HERE <AROOM .WINNER>>
  1148. <MAPLEAVE>)>)>>
  1149. .UV>)
  1150. (<OR <==? .PA ,DROP!-WORDS>
  1151. <==? .PA ,PUT!-WORDS>>
  1152. <MAPF <>
  1153. <FUNCTION (X) #DECL ((X) OBJECT)
  1154. <PUT .PRSVEC 2 .X>
  1155. <TELL <ODESC2 .X> 0 ": ">
  1156. <APPLY-RANDOM .RA>
  1157. <COND (<N==? .HERE <AROOM .WINNER>>
  1158. <MAPLEAVE>)>>
  1159. .UV>)>
  1160. T>
  1161. <PSETG LOSSTR "I can't do everything, because I ran out of room.">
  1162. <DEFINE EVERYTHING ("AUX" (PRSVEC ,PRSVEC)
  1163. (PA <1 .PRSVEC>) PI (SUV ,OBJ-UV) (TUV <TOP .SUV>)
  1164. (LU <LENGTH .TUV>) (HERE ,HERE) (WINNER ,WINNER))
  1165. #DECL ((PA) VERB (SUV TUV) <UVECTOR [REST OBJECT]> (LU) FIX (HERE) ROOM
  1166. (WINNER) ADV (PI) OBJECT)
  1167. <COND (<==? .PA ,TAKE!-WORDS>
  1168. <MAPF <>
  1169. <FUNCTION (X) #DECL ((X) OBJECT)
  1170. <COND (<AND <OVIS? .X> <NOT <TRNN .X ,ACTORBIT>>>
  1171. <COND (<==? .SUV .TUV>
  1172. <TELL ,LOSSTR>
  1173. <MAPLEAVE>)>
  1174. <SET SUV <BACK .SUV>>
  1175. <PUT .SUV 1 .X>)>>
  1176. <ROBJS .HERE>>)
  1177. (<==? .PA ,DROP!-WORDS>
  1178. <MAPF <>
  1179. <FUNCTION (X) #DECL ((X) OBJECT)
  1180. <SET SUV <BACK .SUV>>
  1181. <PUT .SUV 1 .X>>
  1182. <AOBJS .WINNER>>)
  1183. (<==? .PA ,PUT!-WORDS>
  1184. <SET PI <3 .PRSVEC>>
  1185. <PROG RP ()
  1186. <MAPF <>
  1187. <FUNCTION (X) #DECL ((X) OBJECT)
  1188. <COND (<AND <OVIS? .X> <N==? .X .PI> <NOT <TRNN .X ,ACTORBIT>>>
  1189. <COND (<==? .SUV .TUV>
  1190. <TELL ,LOSSTR>
  1191. <RETURN T .RP>)>
  1192. <SET SUV <BACK .SUV>>
  1193. <PUT .SUV 1 .X>)>>
  1194. <ROBJS .HERE>>
  1195. <MAPF <>
  1196. <FUNCTION (X) #DECL ((X) OBJECT)
  1197. <COND (<AND <==? .SUV .TUV>
  1198. <N==? .X .PI>>
  1199. <TELL ,LOSSTR>
  1200. <RETURN T .RP>)>
  1201. <SET SUV <BACK .SUV>>
  1202. <PUT .SUV 1 .X>>
  1203. <AOBJS .WINNER>>>)>
  1204. <FROB-LOTS .SUV>>
  1205. <DEFINE VALUABLES ("AUX" (PRSVEC ,PRSVEC)
  1206. (PA <1 .PRSVEC>) (SUV ,OBJ-UV) (TUV <TOP .SUV>) PI
  1207. (LU <LENGTH .TUV>) (HERE ,HERE) (WINNER ,WINNER))
  1208. #DECL ((PA) VERB (SUV TUV) <UVECTOR [REST OBJECT]> (LU) FIX (HERE) ROOM
  1209. (WINNER) ADV (PI) OBJECT)
  1210. <COND (<==? .PA ,TAKE!-WORDS>
  1211. <MAPF <>
  1212. <FUNCTION (X) #DECL ((X) OBJECT)
  1213. <COND (<AND <OVIS? .X>
  1214. <NOT <TRNN .X ,ACTORBIT>>
  1215. <NOT <0? <OTVAL .X>>>>
  1216. <COND (<==? .SUV .TUV>
  1217. <TELL ,LOSSTR>
  1218. <MAPLEAVE>)>
  1219. <SET SUV <BACK .SUV>>
  1220. <PUT .SUV 1 .X>)>>
  1221. <ROBJS .HERE>>)
  1222. (<==? .PA ,DROP!-WORDS>
  1223. <MAPF <>
  1224. <FUNCTION (X) #DECL ((X) OBJECT)
  1225. <COND (<NOT <0? <OTVAL .X>>>
  1226. <SET SUV <BACK .SUV>>
  1227. <PUT .SUV 1 .X>)>>
  1228. <AOBJS .WINNER>>)
  1229. (<==? .PA ,PUT!-WORDS>
  1230. <SET PI <3 .PRSVEC>>
  1231. <PROG RP ()
  1232. <MAPF <>
  1233. <FUNCTION (X) #DECL ((X) OBJECT)
  1234. <COND (<AND <==? .SUV .TUV>
  1235. <N==? .X .PI>>
  1236. <TELL ,LOSSTR>
  1237. <RETURN T .RP>)>
  1238. <COND (<AND <OVIS? .X>
  1239. <NOT <0? <OTVAL .X>>>>
  1240. <SET SUV <BACK .SUV>>
  1241. <PUT .SUV 1 .X>)>>
  1242. <ROBJS .HERE>>
  1243. <MAPF <>
  1244. <FUNCTION (X) #DECL ((X) OBJECT)
  1245. <COND (<AND <==? .SUV .TUV>
  1246. <N==? .X .PI>>
  1247. <TELL ,LOSSTR>
  1248. <RETURN T .RP>)>
  1249. <COND (<NOT <0? <OTVAL .X>>>
  1250. <SET SUV <BACK .SUV>>
  1251. <PUT .SUV 1 .X>)>>
  1252. <AOBJS .WINNER>>>)>
  1253. <FROB-LOTS .SUV>>
  1254. <DEFINE OPENER OPEN-ACT ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>) (OUTCHAN ,OUTCHAN))
  1255. #DECL ((PRSO) OBJECT (PV) <VECTOR [3 ANY]> (OUTCHAN) CHANNEL)
  1256. <COND (<OBJECT-ACTION>)
  1257. (<NOT <TRNN .PRSO ,CONTBIT>>
  1258. <TELL "You must tell me how to do that to a " 1 <ODESC2 .PRSO> ".">)
  1259. (<N==? <OCAPAC .PRSO> 0>
  1260. <COND (<OOPEN? .PRSO> <TELL "It is already open.">)
  1261. (T
  1262. <PUT .PRSO ,OOPEN? T>
  1263. <COND (<OR <EMPTY? <OCONTENTS .PRSO>>
  1264. <TRANSPARENT? .PRSO>>
  1265. <TELL "Opened.">)
  1266. (<SETG TELL-FLAG T>
  1267. <TELL "Opening the " 0 <ODESC2 .PRSO> " reveals ">
  1268. <PRINT-CONTENTS <OCONTENTS .PRSO>>
  1269. <PRINC !\.>
  1270. <CRLF>)>)>)
  1271. (<TELL "The " 1 <ODESC2 .PRSO> " cannot be opened.">)>>
  1272. <DEFINE CLOSER CLOSE-ACT ("AUX" (PV ,PRSVEC) (PRSO <2 .PV>))
  1273. #DECL ((PV) <VECTOR [3 ANY]> (PRSO) OBJECT)
  1274. <COND (<OBJECT-ACTION>)
  1275. (<NOT <TRNN .PRSO ,CONTBIT>>
  1276. <TELL "You must tell me how to do that to a " 1 <ODESC2 .PRSO> ".">)
  1277. (<N==? <OCAPAC .PRSO> 0>
  1278. <COND (<OOPEN? .PRSO> <PUT .PRSO ,OOPEN? <>> <TELL "Closed.">)
  1279. (T <TELL "It is already closed.">)>)
  1280. (<TELL "You cannot close that.">)>>
  1281. <DEFINE FIND ("AUX" (PRSO <2 ,PRSVEC>))
  1282. #DECL ((PRSO) <OR FALSE OBJECT>)
  1283. <COND (<OBJECT-ACTION>)
  1284. (.PRSO
  1285. <FIND-FROB .PRSO
  1286. <ROBJS ,HERE>
  1287. ", which is in the room."
  1288. "There is a "
  1289. " here.">
  1290. <FIND-FROB .PRSO
  1291. <AOBJS ,WINNER>
  1292. ", which you are carrying."
  1293. "You are carrying a "
  1294. ".">
  1295. <COND (<NOT ,TELL-FLAG>
  1296. <TELL "I can't see that here.">)>)
  1297. (<TELL "I don't know what that is.">)>>
  1298. <DEFINE FIND-FROB (PRSO OBJL STR1 STR2 STR3)
  1299. #DECL ((OBJ) OBJECT (OBJL) <LIST [REST OBJECT]> (STR1 STR2 STR3) STRING)
  1300. <MAPF <>
  1301. <FUNCTION (X) #DECL ((X) OBJECT)
  1302. <COND (<==? .X .PRSO>
  1303. <TELL .STR2 1 <ODESC2 .X> .STR3>)
  1304. (<OR <TRANSPARENT? .X>
  1305. <AND <OPENABLE? .X> <OOPEN? .X>>>
  1306. <MAPF <>
  1307. <FUNCTION (Y) #DECL ((Y) OBJECT)
  1308. <COND (<==? .Y .PRSO>
  1309. <TELL .STR2 1 <ODESC2 .Y> .STR3>
  1310. <TELL "It is in the "
  1311. 1
  1312. <ODESC2 .X>
  1313. .STR1>)>>
  1314. <OCONTENTS .X>>)>>
  1315. .OBJL>>
  1316. ;"OBJECT-ACTION --
  1317. CALL OBJECT FUNCTIONS FOR DIRECT AND INDIRECT OBJECTS"
  1318. <DEFINE OBJECT-ACTION ("AUX" (VEC ,PRSVEC) (PRSO <2 .VEC>) (PRSI <3 .VEC>))
  1319. #DECL ((PRSO PRSI) <OR OBJECT FALSE> (VEC) VECTOR)
  1320. <PROG ()
  1321. <COND (.PRSI <AND <APPLY-OBJECT .PRSI> <RETURN T>>)>
  1322. <COND (.PRSO <APPLY-OBJECT .PRSO>)>>>
  1323. "SIMPLE OBJ-HERE: IS IT IN THE ROOM OR IN THE GUY'S HAND. TO DO FULL
  1324. SEARCH, USE GET-OBJECT"
  1325. <DEFINE OBJ-HERE? (OBJ "AUX" NOBJ (RM ,HERE) (WIN ,WINNER))
  1326. #DECL ((OBJ) OBJECT (RM) ROOM (WIN) ADV (NOBJ) <OR FALSE OBJECT>)
  1327. <PROG ()
  1328. <COND (<NOT <OVIS? .OBJ>> <RETURN <>>)
  1329. (<SET NOBJ <OCAN .OBJ>>
  1330. <COND (<OOPEN? .NOBJ> <SET OBJ .NOBJ>) (<RETURN <>>)>)>
  1331. <OR <MEMQ .OBJ <ROBJS .RM>> <MEMQ .OBJ <AOBJS .WIN>>>>>
  1332. <DEFINE SPLICE-OUT (OBJ AL)
  1333. #DECL ((AL) LIST)
  1334. <COND (<==? <1 .AL> .OBJ> <REST .AL>)
  1335. (T
  1336. <REPEAT ((NL <REST .AL>) (OL .AL))
  1337. #DECL ((NL OL) LIST)
  1338. <COND (<==? <1 .NL> .OBJ>
  1339. <PUTREST .OL <REST .NL>>
  1340. <RETURN .AL>)
  1341. (<SET OL .NL> <SET NL <REST .NL>>)>>)>>
  1342. "WEIGHT: Get sum of OSIZEs of supplied list, recursing to the nth level."
  1343. <DEFINE WEIGHT (OBJL "AUX" (BIGFIX ,BIGFIX))
  1344. #DECL ((OBJL) <LIST [REST OBJECT]> (BIGFIX) FIX (VALUE) FIX)
  1345. <MAPF ,+
  1346. <FUNCTION (OBJ)
  1347. #DECL ((OBJ) OBJECT)
  1348. <+ <COND (<==? <OSIZE .OBJ> ,BIGFIX> 0)
  1349. (<OSIZE .OBJ>)>
  1350. <WEIGHT <OCONTENTS .OBJ>>>>
  1351. .OBJL>>
  1352. <DEFINE POUR () T>
  1353. <DEFINE MOVE ("AUX" (VEC ,PRSVEC) (RM <AROOM ,WINNER>) (OBJ <2 .VEC>))
  1354. #DECL ((VEC) VECTOR (RM) ROOM (OBJ) <OR ATOM OBJECT>)
  1355. <COND (<MEMQ .OBJ <ROBJS .RM>> <OBJECT-ACTION>)
  1356. (.OBJ
  1357. <TELL "I can't get to that to move it.">)>>
  1358. <DEFINE VICTIMS? (RM)
  1359. #DECL ((RM) ROOM)
  1360. <MAPF <>
  1361. <FUNCTION (X)
  1362. #DECL ((X) OBJECT)
  1363. <COND (<TRNN .X ,VICBIT> <MAPLEAVE .X>)>>
  1364. <ROBJS .RM>>>
  1365. <DEFINE LAMP-ON LAMPO ("AUX" (PRSVEC ,PRSVEC) (ME ,WINNER) (OBJ <2 .PRSVEC>) (LIT?
  1366. <LIT? ,HERE>))
  1367. #DECL ((ME) ADV (OBJ) OBJECT (LAMPO) ACTIVATION)
  1368. <COND (<AND <TRNN .OBJ ,BURNBIT>
  1369. <3 .PRSVEC>
  1370. <PUT .PRSVEC 1 ,BURN!-WORDS>>
  1371. <BURNER>)
  1372. (<OBJECT-ACTION>)
  1373. (<COND (<AND <N==? <OLIGHT? .OBJ> 0>
  1374. <MEMQ .OBJ <AOBJS .ME>>>)
  1375. (T <TELL "You can't turn that on."> <RETURN T .LAMPO>)>
  1376. <COND (<G? <OLIGHT? .OBJ> 0> <TELL "It is already on.">)
  1377. (<PUT .OBJ ,OLIGHT? 1>
  1378. <TELL "The " 1 <ODESC2 .OBJ> " is now on.">
  1379. <COND (<NOT .LIT?>
  1380. <PUT ,PRSVEC 2 <>>
  1381. <ROOM-INFO <>>)>)>)>>
  1382. <DEFINE LAMP-OFF LAMPO ("AUX" (ME ,WINNER) (OBJ <2 ,PRSVEC>))
  1383. #DECL ((ME) ADV (OBJ) OBJECT (LAMPO) ACTIVATION)
  1384. <COND (<OBJECT-ACTION>)
  1385. (<COND (<AND <N==? <OLIGHT? .OBJ> 0>
  1386. <MEMQ .OBJ <AOBJS .ME>>>)
  1387. (<TELL "You can't turn that off."> <RETURN T .LAMPO>)>
  1388. <COND (<L? <OLIGHT? .OBJ> 0> <TELL "It is already off.">)
  1389. (<PUT .OBJ ,OLIGHT? -1>
  1390. <TELL "The " 1 <ODESC2 .OBJ> " is now off.">
  1391. <OR <LIT? ,HERE> <TELL "It is now pitch black.">>)>)>>
  1392. "PARSER & AUXILIARIES"
  1393. <SETG INBUF <ISTRING 100>>
  1394. ;"SET UP INPUT ERROR HANDLER TO CAUSE EPARSE TO FALSE OUT"
  1395. <PSETG CNTPRS "I can't parse that.">
  1396. <SETG PRSVEC <IVECTOR 3 #FALSE ()>>
  1397. <DEFINE WORD? (W) <LOOKUP .W ,WORDS>>
  1398. <DEFINE THIS-IT? (OBJNAM OBJ ADJ)
  1399. #DECL ((OBJNAM) ATOM (OBJ) OBJECT (ADJ) <OR FALSE ADJECTIVE>)
  1400. <COND (<AND <OVIS? .OBJ>
  1401. <OR <==? .OBJNAM <OID .OBJ>> <MEMQ .OBJNAM <ONAMES .OBJ>>>>
  1402. <COND (<NOT .ADJ>) (<MEMQ .ADJ <OADJS .OBJ>>)>)>>
  1403. <SETG LEXV <IVECTOR 10 '<REST <ISTRING 5> 5>>>
  1404. <GDECL (LEXV) <VECTOR [REST STRING]> (BRKS) STRING>
  1405. <DEFINE LEX (S
  1406. "OPTIONAL" (SX <REST .S <LENGTH .S>>) (SILENT? <>)
  1407. "AUX" (BRKS ,BRKS) (V ,LEXV) (S1 .S) (QUOT <>))
  1408. #DECL ((S S1 SX BRKS) STRING
  1409. (SILENT? QUOT) <OR ATOM FALSE> (VALUE) <OR FALSE VECTOR>
  1410. (V) <VECTOR [REST STRING]>)
  1411. <MAPR <>
  1412. <FUNCTION (X "AUX" (STR <1 .X>))
  1413. #DECL ((X) <VECTOR [REST STRING]> (STR) STRING)
  1414. <PUT .X 1 <REST .STR <LENGTH .STR>>>>
  1415. .V>
  1416. <COND
  1417. (<==? <1 .S> !\?> <PUT .V 1 <SUBSTRUC "HELP" 0 4 <BACK <1 .V> 4>>>)
  1418. (<REPEAT (SLEN)
  1419. #DECL ((SLEN) FIX)
  1420. <COND
  1421. (<OR <==? <LENGTH .S1> <LENGTH .SX>> <MEMQ <1 .S1> .BRKS>>
  1422. <AND <G? <LENGTH .S1> <LENGTH .SX>>
  1423. <OR <==? <1 .S1> !\'> <==? <1 .S1> !\">>
  1424. <NOT .QUOT>
  1425. <SET QUOT T>
  1426. <SET V <REST .V>>>
  1427. <COND
  1428. (<N==? .S .S1>
  1429. <COND
  1430. (<EMPTY? .V> <OR .SILENT? <TELL "I'm too simple-minded for that.">>)
  1431. (<PUT .V
  1432. 1
  1433. <UPPERCASE <SUBSTRUC .S
  1434. 0
  1435. <SET SLEN
  1436. <MIN <- <LENGTH .S> <LENGTH .S1>>
  1437. 5>>
  1438. <BACK <1 .V> .SLEN>>>>
  1439. <SET V <REST .V>>)>)>
  1440. <COND (<==? <LENGTH .S1> <LENGTH .SX>> <RETURN .V>)>
  1441. <SET S <REST .S1>>)>
  1442. <SET S1 <REST .S1>>>)>
  1443. ,LEXV>
  1444. <PSETG BRKS "\"' :;.,?!
  1445. ">
  1446. <DEFINE ANYTHING (S SX)
  1447. #DECL ((S SX) STRING)
  1448. <MAPR <>
  1449. <FUNCTION (X)
  1450. <COND (<==? .X .SX> <MAPLEAVE <>>)
  1451. (<NOT <MEMQ <1 .X> ,BRKS>> <MAPLEAVE .X>)>>
  1452. .S>>
  1453. <DEFINE UPPERCASE (STR)
  1454. #DECL ((STR) STRING)
  1455. <MAPR <>
  1456. <FUNCTION (S "AUX" (C <ASCII <1 .S>>))
  1457. <COND (<AND <G? .C 96> <L=? .C 122>>
  1458. <PUT .S 1 <ASCII <- .C 32>>>)>>
  1459. .STR>
  1460. .STR>
  1461. <DEFINE WAIT ("OPTIONAL" (NUM 3))
  1462. #DECL ((NUM) FIX)
  1463. <TELL "Time passes...">
  1464. <REPEAT ((N .NUM))
  1465. #DECL ((N) FIX)
  1466. <COND (<OR <L? <SET N <- .N 1>> 0>
  1467. <CLOCK-DEMON ,CLOCKER>>
  1468. <RETURN>)>>>
  1469. "RUNS ONLY IF PARSE WON, TO PREVENT SCREWS FROM TYPOS."
  1470. <DEFINE CLOCK-DEMON (HACK "AUX" CA (FLG <>))
  1471. #DECL ((HACK) HACK (FLG) <OR ATOM FALSE>)
  1472. <COND (,PARSE-WON
  1473. <PUT ,PRSVEC 2 <>>
  1474. <PUT ,PRSVEC 3 <>>
  1475. <MAPF <>
  1476. <FUNCTION (EV "AUX" (TICK <CTICK .EV>))
  1477. #DECL ((EV) CEVENT (TICK) FIX)
  1478. <COND (<NOT <CFLAG .EV>>)
  1479. (<0? .TICK>)
  1480. (<L? .TICK 0>
  1481. <PUT ,PRSVEC 1 ,C-INT!-WORDS>
  1482. <COND (<TYPE? <SET CA <CACTION .EV>> OFFSET>
  1483. <DISPATCH .CA>)
  1484. (<APPLY .CA>)>)
  1485. (<PUT .EV ,CTICK <SET TICK <- .TICK 1>>>
  1486. <AND <0? .TICK>
  1487. <SET FLG T>
  1488. <PUT ,PRSVEC 1 ,C-INT!-WORDS>
  1489. <COND (<TYPE? <SET CA <CACTION .EV>> OFFSET>
  1490. <DISPATCH .CA>)
  1491. (<APPLY .CA>)>>)>>
  1492. <HOBJS .HACK>>)>
  1493. .FLG>
  1494. <GDECL (CLOCKER) HACK>
  1495. <DEFINE CLOCK-INT (CEV "OPTIONAL" (NUM <>) (CLOCKER ,CLOCKER))
  1496. #DECL ((CEV) CEVENT (NUM) <OR FIX FALSE> (CLOCKER) HACK)
  1497. <COND (<NOT <MEMQ .CEV <HOBJS .CLOCKER>>>
  1498. <PUT .CLOCKER ,HOBJS (.CEV !<HOBJS .CLOCKER>)>)>
  1499. <COND (.NUM <PUT .CEV ,CTICK .NUM>)>>
  1500. <SETG DEMONS ()>
  1501. <OR <LOOKUP "COMPILE" <ROOT>>
  1502. <GASSIGNED? GROUP-GLUE>
  1503. <ADD-DEMON <SETG CLOCKER <CHTYPE [CLOCK-DEMON ()] HACK>>>>
  1504. <DEFINE BOARD ("AUX" (OBJ <2 ,PRSVEC>) (WIN ,WINNER) (AV <AVEHICLE .WIN>))
  1505. #DECL ((OBJ) OBJECT (WIN) ADV (AV) <OR FALSE OBJECT>)
  1506. <COND (<NOT <MEMQ .OBJ <ROBJS ,HERE>>>
  1507. <TELL "The " 1 <ODESC2 .OBJ> " must be on the ground to be boarded.">)
  1508. (<TRNN .OBJ ,VEHBIT>
  1509. <COND (.AV
  1510. <TELL "You are already in a "
  1511. 1
  1512. <ODESC2 .OBJ>
  1513. ", cretin!">)
  1514. (T
  1515. <COND (<OBJECT-ACTION>)
  1516. (<TELL "You are in the " 1 <ODESC2 .OBJ> ".">
  1517. <PUT .WIN ,AVEHICLE .OBJ>
  1518. <PUT .OBJ
  1519. ,OCONTENTS
  1520. (<FIND-OBJ "#####"> !<OCONTENTS .OBJ>)>)>)>)
  1521. (<TELL "I suppose you have a theory on boarding "
  1522. 1
  1523. <ODESC2 .OBJ>
  1524. "s.">)>>
  1525. <DEFINE UNBOARD ("AUX" (OBJ <2 ,PRSVEC>) (WIN ,WINNER) (AV <AVEHICLE .WIN>))
  1526. #DECL ((OBJ) OBJECT (WIN) ADV (AV) <OR FALSE OBJECT>)
  1527. <COND (<==? .AV .OBJ>
  1528. <COND (<OBJECT-ACTION>)
  1529. (<RTRNN ,HERE ,RLANDBIT>
  1530. <TELL
  1531. "You are on your own feet again.">
  1532. <PUT .WIN ,AVEHICLE <>>
  1533. <PUT .OBJ
  1534. ,OCONTENTS
  1535. <SPLICE-OUT <FIND-OBJ "#####"> <OCONTENTS .OBJ>>>)
  1536. (<TELL
  1537. "You realize, just in time, that disembarking here would probably be
  1538. fatal.">)>)
  1539. (<TELL
  1540. "You aren't in that!">)>>
  1541. <DEFINE GOTO (RM
  1542. "AUX" (WIN ,WINNER) (AV <AVEHICLE ,WINNER>) (HERE ,HERE)
  1543. (LB <RTRNN .RM ,RLANDBIT>))
  1544. #DECL ((HERE RM) ROOM (WIN) ADV (AV) <OR FALSE OBJECT>
  1545. (LB) <OR ATOM FALSE>)
  1546. <COND (<OR <AND <NOT .LB> <OR <NOT .AV> <NOT <RTRNN .RM <ORAND .AV>>>>>
  1547. <AND <RTRNN .HERE ,RLANDBIT>
  1548. .LB
  1549. .AV
  1550. <N==? <ORAND .AV> ,RLANDBIT>
  1551. <NOT <RTRNN .RM <ORAND .AV>>>>>
  1552. <COND (.AV <TELL "You can't go there in a " 1 <ODESC2 .AV> ".">)
  1553. (<TELL "You can't go there without a vehicle.">)>
  1554. <>)
  1555. (<RTRNN .RM ,RMUNGBIT> <TELL <RRAND .RM>>)
  1556. (T
  1557. <COND (<N==? .WIN ,PLAYER>
  1558. <REMOVE-OBJECT <AOBJ .WIN>>
  1559. <INSERT-OBJECT <AOBJ .WIN> .RM>)>
  1560. <COND (.AV <REMOVE-OBJECT .AV> <INSERT-OBJECT .AV .RM>)>
  1561. <PUT ,WINNER ,AROOM <SETG HERE .RM>>
  1562. <SCORE-ROOM .RM>
  1563. T)>>
  1564. <DEFINE BACKER ()
  1565. <TELL
  1566. "He who puts his hand to the plow and looks back is not fit for the
  1567. kingdom of winners. In any case, \"back\" doesn't work.">>
  1568. <DEFINE ACT-HACK ()
  1569. <OR <OBJECT-ACTION> T>>
  1570. <DEFINE MUNG-ROOM (RM STR)
  1571. #DECL ((RM) ROOM (STR) STRING)
  1572. <RTRO .RM ,RMUNGBIT>
  1573. <PUT .RM ,RRAND .STR>>
  1574. <DEFINE COMMAND ("AUX" (PV ,PRSVEC) (PO <2 .PV>) (V <REST <MEMBER "" ,LEXV>>) (HS ,HERE)
  1575. (WIN ,WINNER) (PLAY ,PLAYER))
  1576. #DECL ((PO) OBJECT (PV V) VECTOR (HS) ROOM (WIN PLAY) ADV)
  1577. <COND (<N==? .WIN .PLAY>
  1578. <TELL "You cannot talk through another person!">)
  1579. (<TRNN .PO ,ACTORBIT>
  1580. <SETG WINNER <ORAND .PO>>
  1581. <RDCOM .V>
  1582. <SETG WINNER .PLAY>
  1583. <SETG HERE .HS>)
  1584. (<TELL "You cannot talk to that!">)>>