tvguts.149
<USE "ASYLUM" "MADMAN" "INFERIOR" "MUDTEC">
<SETG FROBS
'![<ASK.QUESTIONS> ;"Answer"
<BABBLE-SORT> ;"Babble, slowly"
<RUNJOB "SYS2;TS BABBLE" "BABBLE" T> ;"Babble, quickly"
<GRADE.STUFF> ;"Grade"
<MAKE.QUESTIONS> ;"Make questions"
<RUNJOB "SYS2;TS TVPEEK" "TVPEEK" <>> ;"Peek"
<PSCORES> ;"Printing scores"
<QUIT> ;"Leave"
<READ.MAIL> ;"Read mail"
<PRINT.QSCORE> ;"Status of questions"
<PRINT.QSCORE <>> ;"Summary status of questions"
<BABBLE-SORT T> ;"Tiny babble"
<RUNJOB "SYS2;TS TWHOIS" "TWHOIS" T> ;"Twhois"!]>
<SETG FROB-NAMES
'["
Answering Questions.
"
"
Babbling
"
"
DDT.babbling
"
"
Grading/Reading Answers.
"
"
Making questions
"
"
Peeking
"
"
Printing score
"
"
Quitting
"
"
Reading mail.
"
"
Status of questions
"
"
Summary status of questions
"
"
Tiny babbling
"
"
Twhois
"]>
<SETG TECO <>>
<OR <GASSIGNED? TUV> <SETG TUV <IUVECTOR 4 0>>>
<SETG TTUV <IUVECTOR 1 0>>
<SETG NTTUV <IUVECTOR 1 0>>
<SETG TBUV <IUVECTOR 4 0>>
<SETG FOOUV <IUVECTOR 4 0>>
<SETG CTRLG-KILL <>>
<GDECL (TUV TBUV FOOUV)
<UVECTOR [4 FIX]>
(TTUV NTTUV)
<UVECTOR FIX>
(CTRLG-KILL)
<OR ATOM FALSE>>
<SETG STATUS-VECTOR
'[0
"Grading"
1
"Answer "
2
"Babbling"
3
"Reading mail"
4
"Making "
5
"Peek"
6
"Start up"
7
"Printing score"
8
"Command"
9
"Updating"
10
"Status"
11
"FLUSH"
12
"ERROR"
13
"SHOUT"]>
<DEFINE DFUMP ("OPTIONAL" (FNAM "MADMAN;TV FOO"))
#DECL ((FNAM) STRING)
<DBG>
<CHAR-INIT>
<FUMP -1 ,TIME -1 .FNAM>>
<SETG PLAYER-CT 0>
<GDECL (PG PLAYER-CT) FIX (LASTMAIL) WORD>
<DEFINE FUMP (VERSION
"OPTIONAL" (SAVER ,TIME) (MODIF 0) (FNAM "MADMAN;TV FILE")
"AUX" M PG PLAYERS TEMP PLAYER)
#DECL ((VERSION MODIF) FIX (M) <OR FALSE LIST> (SAVER) APPLICABLE
(PLAYERS) STRUCTURED (PG TEMP) FIX (FNAM) STRING (PLAYER) TIME
(IMLAC) <SPECIAL <OR ATOM FALSE>>)
<SETG ASPACE <AFIND 1>>
<SETG SSPACE <AFIND 1>>
<SETG QSPACE <AFIND 1>>
<SETG TVSPACE ,ASPACE>
<SETG LOSSSPACE <AFIND 2>>
<PAGE-GIVE <PAGE-FIND 15> 15>
<COND
(<=? <APPLY .SAVER "MADMAN;TRV SAVFIL"> "SAVED">)
(<AND <DINIT> <>>)
(<AND <=? <JNAME> "DEBUG"> <MEMQ <CHTYPE <XUNAME> TIME> ,WINNERS>>
<SETG TVASS <OPEN-DATA-FILE .FNAM <> 7 5>>
"LOSING")
(<SETG TVASS <OPEN-DATA-FILE .FNAM <> 7 5>>
<UNWIND <PROG ()
<OR <MEMQ <SETG PLAYER <SET PLAYER <CHTYPE <XUNAME> TIME>>>
,WINNERS>
<SETG CTRLG-KILL T>>
<PRINC "
TRIVIA.">
<PRIN1 .VERSION>
<COND (<0? .MODIF>) (<PRINC "."> <PRIN1 .MODIF>)>
<CRLF>
<IPC-OFF>
<IPC-ON <SETG SPLAYER <MYSIXTOS .PLAYER>> "TRIVIA">
<COMREP>
<INIT> ;"SET UP TTY'S"
<SET IMLAC?!-CALRDR!-PACKAGE .IMLAC?>
<GET-SPACE ,ASPACE>
<GET-SPACE ,SSPACE>
<GET-SPACE ,QSPACE>
<GET-SPACE ,LOSSSPACE>
<NEW-LOSS>
<RESET ,INCHAN>
<COND (<SET M <MEMQ .PLAYER ,LOSSTABLE>>
<SETG LUBLK <3 .M>>
<SETG TINDEX <4 .M>>
<OR <PASS-CHECK <2 .M>> <QUIT>>
<PRINC "
Last played ">
<PDSKDATE <DATA-READW ,TVASS <+ ,LUBLK ,LASTIN>>>)
(<SETG LUBLK <NEW-USER .PLAYER>>)>
<AND <SET PG <DIRMAP ,TVASS ,PEEK-PAGE>>
<DIR-INIT .PG>
<PUT <MEMQ .PG <5 ,TVASS>> 3 1>
<SET TEMP
<+ ,PEEK-START
<SETG PG <* .PG 1024>>
<SETG TINDEX <* ,TINDEX 4>>>>
<COND (<DHLOCK .TEMP>)
(T <VALRET ":KILL
:ALREADY PLAYING
">)>>
<UPDATE-BABBLE ,LUBLK ,TINDEX>
<PUT ,TUV 2 <CHTYPE .PLAYER FIX>>
<PUT ,TUV 3 <CHTYPE <DSKDATE> FIX>>
<SET-STATUS ,$SWAKE>
<DATA-PRINTW ,TVASS
<+ ,LUBLK ,LASTIN>
<SETG DATA-READ-WORD
<SETG DATA-WRITE-WORD <DSKDATE>>>>
<SETG DATA-AUTHOR-WORD <SQUOZE ,PLAYER>>
<SETG LASTMAIL
<CHTYPE <1 <GET-LOC <+ ,PG 1 ,TELEC-START ,TINDEX>
,TTUV>>
WORD>>
<SETG CTRLG-KILL <>>
<READ.ANNOUNCE>
<PLAY-BALL>>
<AND ,CTRLG-KILL <QUIT>>>)
(<PRINC "
TRIVIA DATA BASE MISSING?
"> <QUIT>)>>
<DEFINE UPDATE-BABBLE (LUBLK TINDEX
"AUX" SCORE (TBUV ,TBUV) (PG ,PG) LOC (TTUV ,TTUV))
#DECL ((LOC LUBLK TINDEX PG) FIX (TBUV) <UVECTOR [3 FIX]>
(SCORE) <OR FALSE <UVECTOR [REST UVECTOR]>> (TTUV) <UVECTOR FIX>)
<PUT-LOC <+ .PG ,TELEC-START .TINDEX 2> <PUT .TTUV 1 0>>
<SET LOC <+ .PG ,BABBLE-START .TINDEX>>
<UNWIND <PROG ((TOTAL 0.000) (POSS 0.000))
#DECL ((TOTAL POSS) FLOAT)
<COND (<DHLOCK .LOC>
<SET SCORE
<DATA-AREAD ,TVASS
<+ .LUBLK ,SCORE>
<ARESET ,SSPACE T <>>>>
<GET-LOC .LOC .TBUV>
<PUT .TBUV 2 <GETLASTQ .LUBLK>>
<MAPF <>
<FUNCTION (X)
<SET TOTAL <+ .TOTAL <1 .X>>>
<SET POSS <+ .POSS <2 .X>>>>
.SCORE>
<PUT .TBUV 3 <CHTYPE .TOTAL FIX>>
<PUT .TBUV 4 <CHTYPE .POSS FIX>>
<PUT-LOC .LOC .TBUV>
<DUNLOCK .LOC>)
(<SLEEP 1> <AGAIN>)>>
<DUNLOCK .LOC>>>
<SETG VERBOSE <>>
<DEFINE DO-TELECON ("AUX" FX)
#DECL ((FX) <OR FALSE FIX>)
<COND (<SET FX
<READER '[] "at intervals of " '["" ""] '["FIX"] ,VERBOSE>>
<TELECON .FX>)>>
<SETG TELEC-INTERVAL 0>
<GDECL (TELEC-INTERVAL) FIX>
<DEFINE TELECON (AMT)
#DECL ((AMT) FIX)
<SETG TELEC-INTERVAL .AMT>
<COND (<GASSIGNED? RTIMINT>)
(<SETG RTIMINT <ON "REALT" ,CHECK.MAIL 1>>)>
<PUT-LOC <+ ,PG ,TELEC-START ,TINDEX 2>
<PUT ,TTUV 1 *400000000000*>>
<REALTIMER .AMT>>
<DEFINE OFFTELECON ()
<COND (<GASSIGNED? RTIMINT>
<SETG TELEC-INTERVAL 0>
<OFF ,RTIMINT>
<PUT-LOC <+ ,PG ,TELEC-START ,TINDEX 2> <PUT ,TTUV 1 0>>
<GUNASSIGN RTIMINT>)>>
<DEFINE CHECK.MAIL ("AUX" LST (UV ,TTUV) (TINDEX ,TINDEX))
#DECL ((LST) WORD (UV) <UVECTOR FIX> (TINDEX) FIX)
<COND (<==? <CHTYPE <GETBITS <1 <GET-LOC <+ ,PG ,PEEK-START .TINDEX 3>
.UV>>
<BITS 18 18>>
FIX>
,$SREAD>)
(<==? <SET LST
<CHTYPE <1 <GET-LOC <+ ,TELEC-START ,PG .TINDEX 1>
.UV>>
WORD>>
,LASTMAIL>)
(<SETG LASTMAIL .LST>
<SETG EXISTS T>
<PRINC "
--MESSAGE HERE--
">)>
<INT-LEVEL 0>
<DISMISS T>>
<SETG PNEWMAIL <>>
<SETG EXISTS <>>
<GDECL (PNEWMAIL EXISTS) <OR ATOM FALSE>>
<SETG WINNERS
(<CHTYPE #WORD *554162430000* TIME>
<CHTYPE #WORD *644141000000* TIME>
<CHTYPE #WORD *525542000000* TIME>
<CHTYPE #WORD *435462000000* TIME>
<CHTYPE #WORD *604454000000* TIME>)>
"MARC, TAA, JMB, CLR, PDL"
<DEFINE PASS-CHECK (PW "AUX" PS I)
#DECL ((PS PW) STRING (I) HANDLER)
<SET I
<ON "CHAR"
<FUNCTION (R N)
#DECL ((R) CHARACTER (N) CHANNEL)
<COND (<==? .R <ASCII 19>>
<OR <MEMQ ,PLAYER ,WINNERS> <QUIT>>)>>
8
0
,INCHAN>>
<REPEAT ((N 3))
<RESET .INCHAN>
<TTYECHO .INCHAN <>>
<PRINC "
Password: ">
<READSTRING <SET PS <ISTRING 10>> .INCHAN ,PWTERM>
<UPPERCASE .PS>
<TTYECHO .INCHAN T>
<COND (<=? .PS .PW> <OFF .I> <RETURN T>)
(<SET N <- .N 1>> <AND <L? .N 0> <OFF .I> <RETURN <>>>)>>>
<DEFINE NEW-USER (XUNM "AUX" PS VEC (TVA ,TVASS) (LSP ,LOSSSPACE) (SSP ,SSPACE))
#DECL ((PS) STRING (XUNM) TIME (VEC) <UVECTOR [REST UVECTOR]> (TVA) ASYLUM
(LSP SSP) SPACE)
<PROG ()
<SET PS <ISTRING 10>>
<PRINC "
Your TRIVIA password: ">
<RESET .INCHAN>
<TTYECHO .INCHAN <>>
<READSTRING .PS .INCHAN ,PWTERM>
<UPPERCASE .PS>
<COND (<MEMQ <1 .PS> "
î">
<PRINC "
Illegal password.">
<AGAIN>)>
<TTYECHO .INCHAN T>
<PRINC "
Please confirm your chosen password,">
<OR <PASS-CHECK .PS> <AGAIN>>
<UNWIND
<PRINT-HELP T>
<QUIT>>
<PROG (L)
#DECL ((L) <OR FALSE FIX>)
<COND
(<SET L <DATA-RESERVE .TVA ,LBLEN>>
<PROG (CRAZY P)
#DECL ((CRAZY) <OR FALSE MANIAC> (P) LIST)
<COND
(<SET CRAZY <DATA-OPEN "PRINT" .TVA ,LUSERS>>
<UNWIND
<PROG (TINDEX)
#DECL ((TINDEX) FIX)
<COND (<==? <SET TINDEX
<CHTYPE <DATA-READW .TVA ,HIPOFFSET> FIX>>
83>
<PERR "Can't make NEW-USER--no slots available">)
(T
<SETG TINDEX .TINDEX>
<DATA-PRINTW .TVA ,HIPOFFSET <+ .TINDEX 1>>
<SETG PLAYER-CT <+ .TINDEX 1>>)>
<SET VEC <AIUVECTOR <ARESET .SSP T <>> ,NCAT <AUVECTOR .SSP>>>
<MAPR <>
<FUNCTION (X) <PUT .X 1 <AUVECTOR .SSP 0.000 0.000>>>
.VEC>
<DATA-APRINT .TVA <+ .L ,SCORE> .SSP .VEC>
<DATA-APRINT .TVA
<+ .L ,QASKED>
.SSP
<AIVECTOR <ARESET .SSP T <>> ,NCAT <ALIST .SSP>>>
<ARESET .LSP T <>>
<SET P <DATA-AREAD .TVA ,LUSERS .LSP>>
<SET P <ACONS .LSP .TINDEX .P>>
<SET P <ACONS .LSP .L .P>>
<SET P <ACONS .LSP <ACOPY .LSP .PS> .P>>
<SET P <ACONS .LSP .XUNM .P>>
<SETG LOSSTABLE .P>
<OR <DATA-IPRINT .TVA .CRAZY .LSP .P>
<PERR "Can't print NEW-USER">>
<DATA-CLOSE .TVA .CRAZY>>
<DATA-CLOSE .TVA .CRAZY>>
<DATA-PRINTW .TVA <+ .L ,QNEXT> ,LOWQUES>
<DATA-PRINTW .TVA <+ .L ,ALAST> <+ .L ,ANEXT>>
<DATA-PRINTW .TVA <+ .L ,MLAST> <+ .L ,MNEXT>>
<DATA-PRINTW .TVA <+ .L ,ANNEXT> ,LOMAIL>
.L)
(<AGAIN>)>>)
(<AGAIN>)>>>>
<DEFINE PRINT-HELP ("OPTIONAL" (NEW-PLAYER? <>))
#DECL ((NEW-PLAYER?) <OR ATOM FALSE>)
<COND (.NEW-PLAYER?
<CRLF>
<PRINC ,NEWMSG>)>
<COND (<RUNJOB "SYS1;TS PR" "TVDOC" <COND (.NEW-PLAYER? "HELP")
(T)>>)>>
<SETG LOSEMSG
"
Full documentation can be found in MADMAN;TVDOC > and MADMAN;TVUPD >.">
<SETG NEWMSG
"
The following information has been found more or less essential to new
TRIVIA users. Please read it.">
<DEFINE COMMAND ("AUX" RD)
#DECL ((RD) <OR FALSE SYMBOL>)
<REPEAT ()
<AND ,PNEWMAIL ,EXISTS <READ.MAIL>>
<AND ,FLUSH <FLUSH-EM>>
<SET-STATUS ,$SCOM>
<COND (<SET RD <READER ,MCOMS "
@" '["" ""] '["SYM"] <>>>
<EVAL <2 .RD>>)>>>
<SETG COMS
<MAKEBST "COMMANDS"
'["Announce"
<ANNOUNCE>
"Answer"
<ASK.QUESTIONS>
"Auto.read"
<COND (<SETG PNEWMAIL <NOT ,PNEWMAIL>>
<PRINC "
Automatic reading">)
(T <PRINC "
Manual reading">)>
"Babble"
<BABBLE-SORT>
"DDT.babble"
<RUNJOB "SYS2;TS BABBLE" "BABBLE" T>
"End.teleconference"
<OFFTELECON>
"Grade"
<GRADE.STUFF>
"Help"
<PRINT-HELP>
"Intest"
<PROG ()
<READ.ANNOUNCE>
<PLAY-BALL>>
"Kill.teco"
<TECO-KILL>
"Load.scores"
<MOBY-VEC>
"Make"
<MAKE.QUESTIONS>
"No.simple"
<COND (<SETG IGNORE-SIMPLE <NOT ,IGNORE-SIMPLE>>
<PRINC "
Ignore simple questions">)
(<PRINC "
Read simple questions">)>
"Peek"
<RUNJOB "SYS2;TS TVPEEK" "TVPEEK" <>>
"Print.score"
<PSCORES>
"Question.print"
<PRINT.QSCORE T T>
"Quit"
<QUIT>
"Read.mail"
<READ.MAIL>
"Rpeek"
<RUNJOB "SYS2;TS TVPEEK" "TVPEEK" "R">
"Safety"
<COND (<SETG BUFSAFE <NOT ,BUFSAFE>> <PRINC "
Safe">)
(<PRINC "
Sorry">)>
"Save.tailor"
<SAVE-TAILOR>
"Send.mail"
<SEND.MAIL>
"Sequence"
<GET-SEQUENCE>
"Shout"
<SHOUT>
"Simple.load"
<LOAD.SIMPLE>
"Simple.print"
<PRINT.SIMPLE>
"Simple.update"
<UPDATE.QUESTION <>>
"Status.of.question"
<PRINT.QSCORE>
"Summary.status.of.question"
<PRINT.QSCORE <>>
"Teleconference"
<DO-TELECON>
"Tiny.babble"
<BABBLE-SORT T>
"Tvbug"
<RUNJOB "SYS2;TS TVBUG" "TVBUG" <>>
"Tvtodo"
<RUNJOB "SYS2;TS TVTODO" "TVTODO" T>
"Twhois"
<RUNJOB "SYS2;TS TWHOIS" "TWHOIS" T>
"Update.question"
<UPDATE.QUESTION>
"Verbosity"
<COND (<SETG VERBOSE <NOT ,VERBOSE>> <PRINC "
Verbose">)
(<PRINC "
Unverbose">)>
"Which.teco"
<GET-TECO>]>>
<SETG BUFSAFE <>>
<SETG DCOMS <MAKESST "DCOM" []>>
<SETG MCOMS <MAKEMST "MCOM" [,COMS ,DCOMS]>>
<SETG DCOM
'["Recurse"
<RECURSE>
"Play"
<PLAY>
"Erret"
<DO-ERRET>
"Evaluate"
<DO-EVAL>]>
<SETG DP " with JCL of ">
<GDECL (DP) STRING>
<DEFINE RUNJOB (FILE JNAME JCL? "AUX" (JCL <>) (JOB <>))
#DECL ((FILE JNAME) STRING (JCL?) <OR STRING ATOM FALSE> (JCL) <OR FALSE STRING>
(JOB) <OR FALSE INF>)
<COND (.JCL?
<COND (<TYPE? .JCL? STRING>
<SET JCL .JCL?>)
(T
<SET JCL <READER [] ,DP "" ["LINE"] ,VERBOSE>>)>)>
<CRLF>
<UNWIND
<COND (<SET JOB <INF-LOAD .FILE .JNAME .JCL>>
<INF-START .JOB>
<OR <NOT <2 .JOB>>
<INF-KILL .JOB>>)
(T
<CRLF>
<PRIN1 .JOB>)>
<AND .JOB <2 .JOB> <INF-KILL .JOB>>>>
<DEFINE DO-ERRET () <ERRET <READER '[] "" "" '["ANY"] <>>>>
<DEFINE DO-EVAL () <AND <MEMQ <CHTYPE <XUNAME> TIME> ,WINNERS>
<EVAL <READER '[] "" "" '["ANY"] <>>>>>
<SETG DEBUGSW <>>
<DEFINE DBG () <PUT ,DCOMS 2 ,DCOM> <SETG DEBUGSW T>>
<SETG FLUSH <>>
<SETG QTYPES
<MAKEBST "QT"
'["Command"
1
"Joint"
8
"Long Answer"
2
"Matching"
3
"Multiple Choice"
4
"None"
0
"Quit"
6
"Ranking"
9
"Simple"
7
"True/False"
5]>>
<SETG CATS
<MAKEBST "CAT"
'["Athletics"
1
"Cinema"
2
"Events"
3
"General"
4
"History"
5
"Literature"
6
"Music"
7
"Science Fiction"
8
"TV/Radio"
9]>>
<DEFINE QUESTIONABLE? (STR)
#DECL ((STR) STRING)
<NOT <MAPF <>
<FUNCTION (X) <COND (<G? <ASCII .X> 32> <MAPLEAVE T>)>>
.STR>>>
<DEFINE TP (QUESTION) ;"Hack to get Q's to print evenly"
#DECL ((QUESTION) STRING)
<COND (<L=? <14 .OUTCHAN> 40> <PUT .OUTCHAN 14 41>)>
.QUESTION>
<DEFINE UNTASTEFUL-CODE (Q "OPTIONAL" (GST <>) (LETR <>) "AUX" (IDX 0))
#DECL ((Q) STRUCTURED (GST LETR) <OR 'T FALSE> (IDX) FIX)
<MAPF ,VECTOR
<FUNCTION (X)
<SET IDX <+ .IDX 1>>
<COND (<AND <1? .IDX> .GST>
<MAPRET 2
,MATCH-HACK
<STRING <UNPARSE .IDX>
". "
.X>
0>)>
<MAPRET <STRING <COND (.LETR <ASCII <+ .IDX 96>>)
(<UNPARSE .IDX>)>
". "
.X>
<COND (.GST 0) (.IDX)>>>
.Q>>
<DEFINE FLUSH-EM ()
<COND (<==? ,FLUSH SYSDOWN>
<OUT SYSTEM\ GOING\ DOWN>)
(<==? ,FLUSH SHOUT> <SETG FLUSH <>> <PRINT.SHOUT>)
(<==? ,FLUSH PURGE> <OUT EXCESSIVE-SYSTEM-LOAD>)
(<==? ,FLUSH TECO>
<SETG FLUSH <>>
<COND (,TECO
<TECO-KILL>
<PRINC "
TECO killed to free system resources.
">)>)
(T <OUT ,FLUSH>)>>
<DEFINE OUT (WHY? "AUX" MSG)
#DECL ((WHY?) ATOM (MSG) <VECTOR TIME STRING>)
<SET-STATUS ,$SFLUSH>
<OFF "CHAR" ,INCHAN>
<IPC-OFF>
<INT-LEVEL 999>
<COND (<==? .WHY? T>
<SET MSG <DATA-AREAD ,TVASS ,SHOUTMSG <ARESET ,ASPACE T <>>>>
<CRLF>
<PRINC "TRIVIA brought down by ">
<PRINC <1 .MSG>>
<CRLF>
<PRINC <2 .MSG>>)
(T
<PRINC "TRIVIA brought down due to ">
<PRINC .WHY?>)>
<VALRET ":KILL
:
TRIVIA DOWN!
">>
<DEFINE PRINT.SHOUT ("AUX" (MSG
<DATA-AREAD ,TVASS ,SHOUTMSG <ARESET ,ASPACE T <>>>))
#DECL ((MSG) <VECTOR TIME STRING>)
<CRLF>
<CRLF>
<CRLF>
<IMAGE 7>
<IMAGE 7>
<IMAGE 7>
<PRINC "Message from ">
<6PRINC <1 .MSG>>
<CRLF>
<PRINC <2 .MSG>>
<CRLF>>
<DEFINE FLUSH-TECOS ()
<COND (<MEMQ ,PLAYER ,WINNERS>
<SEND-TRIVIAS TECO>)>>
<DEFINE SHOUT ("AUX" MSG ID (TVA ,TVASS) (ASP ,ASPACE))
#DECL ((MSG) STRING (ID) <OR FALSE MANIAC> (TVA) ASYLUM (ASP) SPACE)
<COND (<MEMQ ,PLAYER ,WINNERS>
<SET MSG <GETBUF "Message: ">>
<COND (<NOT <QUESTIONABLE? .MSG>>
<COND (<SET ID <DATA-OPEN "PRINT" .TVA ,SHOUTMSG>>
<DATA-IPRINT .TVA
.ID
.ASP
<AVECTOR <ARESET .ASP T <>>
,PLAYER
<ACOPY .ASP .MSG>>>
<SEND-TRIVIAS SHOUT>
<DATA-CLOSE .TVA .ID>)
(<CRLF>
<PRINC
"The right hand knows not what the left hand does.">
<CRLF>)>)>)>>
<DEFINE FLUSH-ALL ("OPTIONAL" (WHY? <>) "AUX" ID CH MSG (TVA ,TVASS) (ASP ,ASPACE))
#DECL ((WHY?) <OR ATOM FALSE> (MSG) STRING (CH) <OR CHANNEL FALSE>
(ID) <OR MANIAC FALSE> (TVA) ASYLUM (ASP) SPACE)
<COND (<MEMQ ,PLAYER ,WINNERS>
<CRLF>
<OR <SET CH <OPEN "PRINT" "_MSGS_;TRIVIA DEATH">>
<ERROR .CH>>
<COND (.WHY?
<MSGOUT .WHY? .CH>
<SEND-TRIVIAS .WHY?>)
(T
<SET MSG <GETBUF "Message: ">>
<COND (<NOT <QUESTIONABLE? .MSG>>
<COND (<SET ID <DATA-OPEN "PRINT" .TVA ,SHOUTMSG>>
<DATA-IPRINT .TVA .ID .ASP
<AVECTOR <ARESET .ASP T <>>
,PLAYER
<ACOPY .ASP .MSG>>>
<MSGOUT .MSG .CH>
<SEND-TRIVIAS T>
<DATA-CLOSE .TVA .ID>)
(T
<CRLF>
<PRINC "One at a time, please!">
<CRLF>)>)>)>)
(<QUIT>)>>
<DEFINE MSGOUT (MSG CH) #DECL ((MSG) <OR ATOM STRING> (CH) CHANNEL)
<PRINC "TRIVIA brought down by " .CH>
<PRINC ,PLAYER .CH>
<CRLF .CH>
<PRINC .MSG .CH>
<CLOSE .CH>>
<DEFINE SEND-TRIVIAS (WHAT?
"AUX" (PG ,PG) (UV ,FOOUV) (SENDER ,PLAYER)
(MSG <STRING "<SETG FLUSH " <UNPARSE .WHAT?> ">">))
#DECL ((WHAT?) ANY (PG) FIX (UV) <UVECTOR [4 FIX]> (MSG) STRING (SENDER) TIME)
<SET-STATUS ,$SHOUT>
<REPEAT ((N 0) (LOC <+ .PG ,PEEK-START>) LOSER)
#DECL ((N LOC) FIX (LOSER) TIME)
<COND (<G? .N 83> <RETURN>)
(<AND <GET-LOC .LOC .UV> <0? <1 .UV>>>
<COND (<==? <SET LOSER <CHTYPE <2 .UV> TIME>> .SENDER>)
(T
<SEND <MYSIXTOS .LOSER> "TRIVIA" .MSG *400000000000*>
<6PRINC .LOSER>
<CRLF>)>)>
<SET N <+ .N 1>>
<SET LOC <+ .LOC 4>>>>
<SETG GIVEUP <MAKESST "GIVE" ["
Give up (CR)" <>]>>
<SETG SYMTAB <MAKESST "SYMS" []>>
<SETG ALLSYMS <MAKEMST "ALLSYMS" [,GIVEUP ,SYMTAB]>>
<SETG ALWAYS-ANSWER <>>
<SETG KEEPASKING <>>
<SETG IGNORE-SIMPLE <>>
<SETG T/F <MAKESST "T/F" ["Yes" T "No" <>]>>
<DEFINE TRUE? (STR1 STR2 TRUELST FALSELST "OPTIONAL" INTCHR "AUX" CHR)
#DECL ((STR1 STR2) STRING (INTCHR CHR) CHARACTER (TRUELST FALSELST) STRING)
<PROG ()
<PRINC .STR1>
<RESET ,INCHAN>
<PRINC " (">
<PRINC .STR2>
<PRINC ") ">
<SET CHR <TYI>>
<COND (<AND <ASSIGNED? INTCHR> <==? .CHR .INTCHR>>
<INTERRUPT "CHAR" .INTCHR ,INCHAN>)>
<COND (<MEMQ .CHR .TRUELST>)
(<MEMQ .CHR .FALSELST> <>)
(<AGAIN>)>>>
<DEFINE SEND-PLAYER (WHO WHAT
"OPTIONAL" (WHR ,ALAST) (MUNG-SLOT? <>) (MUNG-SLOT1? <>)
(ASP ,ASPACE) "AUX" (TVA ,TVASS) (TTUV ,NTTUV) NUTS LAST
LOC)
#DECL ((WHO) TIME (WHAT) ANY (ASP) SPACE (NUTS) LIST (LOC LAST WHR) FIX
(TVA) ASYLUM (MUNG-SLOT MUNG-SLOT1) <OR FIX FALSE>
(TTUV) <UVECTOR FIX> (MUNG-SLOT? MUNG-SLOT1?) <OR FIX FALSE>)
<COND (<==? ,PLAYER ,DEBUGNAME>)
(<SET NUTS <GET-LOSER .WHO>>
<SET LAST <+ .WHR <3 .NUTS>>>
<COND (.MUNG-SLOT?
<SET LOC <+ ,PG <* 4 <4 .NUTS>> .MUNG-SLOT?>>
<UNWIND <PROG ()
<COND (<DHLOCK .LOC>
<GET-LOC .LOC .TTUV>
<PUT .TTUV 1 <CHTYPE <4 .WHAT> FIX>>
<PUT-LOC <+ .LOC 1> .TTUV>
<DUNLOCK .LOC>)
(<SLEEP 2> <AGAIN>)>>
<DUNLOCK .LOC>>)
(.MUNG-SLOT1?
<SET LOC <+ 3 ,PG <* 4 <4 .NUTS>> .MUNG-SLOT1?>>
<GET-LOC .LOC .TTUV>
<PUT .TTUV 1 <+ <1 .TTUV> 1>>
<PUT-LOC .LOC .TTUV>)>
<COND (<CHAIN-APPEND .TVA .ASP .WHAT .LAST>
<CRLF>
<PRINC "Sent.">)
(<PERR "SEND-PLAYER FAILURE -- PLEASE REPORT TO MARC">)>)>>
<DEFINE NEW-LOSS ("AUX" NUTS)
#DECL ((NUTS) <OR LIST FALSE>)
<COND (<N==? ,PLAYER-CT
<SETG PLAYER-CT
<CHTYPE <DATA-READW ,TVASS ,HIPOFFSET> FIX>>>
<GUNASSIGN PLAYER-SYMS>
<COND (<SET NUTS <DATA-AREAD ,TVASS ,LUSERS <ARESET ,LOSSSPACE T <>>>>
<SETG LOSSTABLE .NUTS>
.NUTS)
(T
<PERR "Can't read losstable--your TRIVIA is DEAD"
.NUTS
NEW-LOSS>)>)
(T ,LOSSTABLE)>>
<DEFINE CHAIN-APPEND (TVA TVS WHAT CHAIN "AUX" OINT)
#DECL ((TVA) ASYLUM (TVS) SPACE (WHAT) ANY (OINT CHAIN) FIX)
<SET OINT <INT-LEVEL 20>>
<PROG (FROB HIA WHR RETVAL)
#DECL ((FROB HIA) <OR FALSE MANIAC> (RETVAL WHR) FIX)
<COND (<SET FROB <DATA-APRINT .TVA -1 .TVS .WHAT>>
<OR <0? <CHTYPE <DATA-READW .TVA <SET RETVAL <1 .FROB>>>
FIX>>
<AND <INT-LEVEL 0>
<PERR "Non-zero chain pointer"
CHAIN-APPEND
.FROB>>>
<COND (<AND <SET HIA <DATA-OPEN "PRINTW" .TVA .CHAIN>>
<SET WHR <CHTYPE <DATA-READW .TVA .CHAIN> FIX>>
<DATA-PRINTW .TVA .WHR .RETVAL>
<DATA-PRINTW .TVA .HIA .RETVAL>>
<INT-LEVEL .OINT>
.RETVAL)
(<AND <NOT .HIA> <MEMQ <1 .HIA> '(5 6)>>
<STALL <1 .HIA>>
<AGAIN>)
(<PERR "Can't CHAIN-APPEND" .FROB .HIA>)>)
(<MEMQ <1 .FROB> '(5 6)> <STALL <1 .FROB>> <AGAIN>)
(<INT-LEVEL 0>
<PERR "Can't PRINT append, CHAIN-APPEND" .FROB>)>>>
<DEFINE STALL (WHY)
#DECL ((WHY) FIX)
<PRINC "
NON-FATAL TIME OUT, STALLING BECAUSE --">
<PRINC <NTH ,DATA-ERRORS .WHY>>
<SLEEP 4>>
<DEFINE GET-LOSER (PLAYER "AUX" (NUTS ,LOSSTABLE) OINT)
#DECL ((PLAYER) TIME (NUTS) <OR LIST FALSE> (OINT) FIX)
<SET OINT <INT-LEVEL 20>>
<COND (<SET NUTS <MEMQ .PLAYER .NUTS>>)
(<SET NUTS <NEW-LOSS>>
<COND (<SET NUTS <MEMQ .PLAYER .NUTS>>)
(<PERR "Player does not exist!!" .PLAYER GET-LOSER>)>)>
<INT-LEVEL .OINT>
.NUTS>
<DEFINE ADDSCORE (WHO QUES AMT
"AUX" (NUTS <GET-LOSER .WHO>) (TVA ,TVASS) (SSP ,SSPACE) ID
SCORE SCUVEC LBLK CATSCR OINT)
#DECL ((WHO) TIME (QUES) VECTOR (AMT) <OR FIX FLOAT> (TVA) ASYLUM
(NUTS) LIST (SSP) SPACE (ID) <OR MANIAC FALSE> (SCORE) WORD
(SCUVEC) <UVECTOR [REST <UVECTOR FLOAT FLOAT>]>
(OINT LBLK) FIX (CATSCR) <UVECTOR FLOAT FLOAT>)
<COND
(<==? ,PLAYER ,DEBUGNAME>)
(<SET OINT <INT-LEVEL 20>>
<COND
(<SET ID <DATA-OPEN "PRINTW" .TVA <NTH .QUES ,QSCORE>>>
<SET SCORE <DATA-READW .TVA <1 .ID>>>
<SET SCORE
<PUTBITS .SCORE
<BITS 18 18>
<CHTYPE <+ 1 <CHTYPE <GETBITS .SCORE <BITS 18 18>> FIX>>
WORD>>>
<DATA-PRINTW
.TVA
.ID
<PUTBITS .SCORE
<BITS 18 0>
<CHTYPE <+ <FIX <* 1000 .AMT>>
<CHTYPE <GETBITS .SCORE <BITS 18 0>> FIX>>
WORD>>>)
(<INT-LEVEL 0> <PERR "Can't update QUESTION-SCORE" .QUES>)>
<SET LBLK <3 .NUTS>>
<PROG (QVAL (TBUV ,TBUV) (TINDEX <4 .NUTS>)
(LOC <+ ,PG ,BABBLE-START <* 4 .TINDEX>>))
#DECL ((QVAL) FLOAT (TBUV) <UVECTOR [4 FIX]> (TINDEX LOC) FIX)
<COND
(<SET ID <DATA-OPEN "PRINT" .TVA <+ .LBLK ,SCORE>>>
<SET SCUVEC <DATA-IREAD .TVA .ID <ARESET .SSP T <>>>>
<SET CATSCR <NTH .SCUVEC <NTH .QUES ,QCAT>>>
<PUT .CATSCR 1 <FLOAT <+ .AMT <1 .CATSCR>>>>
<PUT .CATSCR
2
<+ <SET QVAL <FLOAT <NTH .QUES ,QVAL>>> <2 .CATSCR>>>
<DATA-IPRINT .TVA .ID .SSP .SCUVEC>
<PROG ()
<COND (<DHLOCK .LOC>
<GET-LOC .LOC .TBUV>
<PUT .TBUV
3
<CHTYPE <+ <CHTYPE <3 .TBUV> FLOAT> <FLOAT .AMT>>
FIX>>
<PUT .TBUV
4
<CHTYPE <+ <CHTYPE <4 .TBUV> FLOAT> .QVAL> FIX>>
<PUT-LOC .LOC .TBUV>
<DUNLOCK .LOC>)
(<SLEEP 2> <AGAIN>)>>
<DATA-CLOSE .TVA .ID>)
(<MEMQ <1 .ID> '(5 6)> <STALL <1 .ID>> <AGAIN>)
(<INT-LEVEL 0>
<PERR "Can't update PLAYER-SCORE" .WHO .AMT .NUTS>)>>
<INT-LEVEL .OINT>)>>
<DEFINE PERR (STR "TUPLE" ARG)
#DECL ((STR) STRING (ARG) TUPLE)
<SET-STATUS ,$SERROR>
<CRLF>
<PRINC "ERROR, ">
<PRINC .STR>
<PRINC ". ">
<SETG REP ,SAVEREP>
<COND (<NOT ,CTRLG-KILL>
<SEND-ERROR .STR .ARG>)>
<ERROR TRIVIA-LOSSAGE!-ERRORS !.ARG>>
<SETG TAASIX <CHTYPE -12322603008 TIME>>
<SETG MARCSIX <CHTYPE -19834195968 TIME>>
<MANIFEST TAASIX MARCSIX>
<SETG TAASTR "TAA">
<SETG MARCSTR "MARC">
<SETG MAINT "MARC or TAA">
<DEFINE SEND-ERROR (STR ARG "AUX" IT)
#DECL ((STR) STRING (IT) FIX (ARG) TUPLE)
<COND (<OR <AND <SET IT <IDLE-TIME ,TAASIX>>
<L? .IT 600>
<CLI-SEND ,TAASTR .STR .ARG>>
<AND <SET IT <IDLE-TIME ,MARCSIX>>
<L? .IT 600>
<CLI-SEND ,MARCSTR .STR .ARG>>>)
(T
<PRINC "Please report to ">
<PRINC ,MAINT>)>>
<DEFINE CLI-SEND (PLAYER MSG ARG "AUX" CH)
#DECL ((CH) <OR CHANNEL FALSE> (PLAYER) STRING)
<COND (<AND <N=? ,SPLAYER .PLAYER>
<SET CH <OPEN "PRINT" .PLAYER "HACTRN" "CLI">>>
<PRINC ,SPLAYER .CH>
<CRLF .CH>
<PRINC .MSG .CH>
<MAPF <> <FUNCTION (X) <PRINT .X .CH>> .ARG>
<CLOSE .CH>
<CRLF>
<PRINC <7 .CH>>
<PRINC " is on line and has been informed.">)>>
<SETG WHOSYMS <MAKESST "FOO" []>>
<DEFINE P-SYMS ("AUX" (NUTS <NEW-LOSS>) (CURSPACE ,LOSSSPACE)
(LS ,LOSSSPACE))
#DECL ((NUTS) LIST (CURSPACE) <SPECIAL SPACE> (LS) SPACE)
<COND (<GASSIGNED? PLAYER-SYMS> ,PLAYER-SYMS)
(<SETG PLAYER-SYMS
<PUT ,WHOSYMS
2
<MAPR ,ALVECTOR
<FUNCTION (X)
<COND (<==? 1 <1 .X>> <MAPRET>)
(<TYPE? <1 .X> TIME>
<MAPRET <ASTRING .LS <MYSIXTOS <1 .X>>> <3 .X>>)
(<MAPRET>)>>
.NUTS>>>)>>
<DEFINE SEND.MAIL ("AUX" (ASP <ARESET ,ASPACE T <>>) WHO LST MSG)
#DECL ((ASP) SPACE (WHO) <OR FALSE VECTOR> (LST) <LIST [REST SYMBOL]>
(MSG) STRING)
<COND
(<SET WHO <READARGS <P-SYMS> "To " '["" ""] '["SYM" "MULT"]>>
<COND (<EMPTY? <SET LST <1 .WHO>>>)
(<SET MSG <GETBUF "Message: " .ASP>>
<MAPF <>
<FUNCTION (X)
<SEND-PLAYER <CHTYPE <STRTOX <1 .X>> TIME>
<AVECTOR .ASP
.MSG
1
,PLAYER
<DSKDATE>>
,MLAST
,TELEC-START>>
.LST>)>)>>
<DEFINE CHAIN-FOLLOW (APP FROM TO "OPTIONAL" (FROB? <>)
"AUX" (TVA ,TVASS)
(LO <CHTYPE <DATA-READW .TVA <+ ,LUBLK .FROM>> FIX>)
(ASP <ARESET ,ASPACE T <>>) (TTUV ,NTTUV) MAIL NEXT)
#DECL ((TVA) ASYLUM (LO FROM TO) FIX (ASP) SPACE
(MAIL) <OR FALSE VECTOR> (NEXT) WORD (TTUV) <UVECTOR <PRIMTYPE WORD>>
(APP) <VECTOR [REST APPLICABLE]> (FROB?) <OR FIX FALSE>)
<COND (<0? .LO> #FALSE ())
(<SET MAIL <DATA-AREAD .TVA .LO .ASP>>
<APPLY <NTH .APP <NTH .MAIL ,ATYPE>> .MAIL>
<AND .FROB?
<GET-LOC .FROB? .TTUV>
<PUT-LOC .FROB? <PUT .TTUV 1 <- <1 .TTUV> 1>>>>
<DATA-PRINTW .TVA
<+ ,LUBLK .FROM>
<SET NEXT <DATA-READW .TVA .LO>>>
<COND (<==? .NEXT #WORD *000000000000*>
<DATA-PRINTW .TVA <+ ,LUBLK .TO> <+ ,LUBLK .FROM>>)>
<DATA-DELETE .TVA .LO>)>>
<DEFINE VERBOHACK ("TUPLE" TUP)
<CRLF>
<COND (<SETG KEEPASKING <NOT ,KEEPASKING>>
<PRINC "Continuous questions mode">
<AND <ASSIGNED? topask>
<LEGAL? .topask>
<RETURN T .topask>>)
(<PRINC "One at a time mode">)>
<CRLF>>
<DEFINE ANSHACK ()
<CRLF>
<COND (<SETG ALWAYS-ANSWER <NOT ,ALWAYS-ANSWER>>
<PRINC "Always give answer mode">
<AND <ASSIGNED? topask>
<LEGAL? .topask>
<RETURN T .topask>>)
(<PRINC "Dont give answers">)>
<CRLF>>
<DEFINE ANSWERHACK ("TUPLE" X)
<PROG ()
<COND (<AND <ASSIGNED? Q.A>
<ASSIGNED? BUF>
<==? <NTH .Q.A ,QTYPE> ,$TLONG>>
<ADDSTRING .BUF <NTH .Q.A 10>>
<PRINC "[Answer added]">)
(<ANSHACK>)>>>
<DEFINE CHAR-INIT ("AUX" FOO)
#DECL ((FOO) <VECTOR [REST CHARACTER <OR APPLICABLE FORM>]>)
<CALRDRINIT>
<SETG SPCCHARS <STRING <ASCII 22> !,SPCCHARS>>
<SET FOO <MEMQ <ASCII 12> .CHRTABLE>>
<PUT .FOO 2 ,BUFHACK>
<SET CHRTABLE
[<ASCII 20> ,ANSWERHACK <ASCII 22> ,VERBOHACK !.CHRTABLE]>
<SET FOO <MEMQ <ASCII 5> .CHRTABLE>>
<PUT .FOO 2 ,BUFTECO>
<SET FOO <MEMQ <ASCII 12> ,XSPCCHARS>>
<PUT .FOO 2 '<CLEAR>>
<SETG XSPCCHARS
[<ASCII 20> '<ANSHACK> <ASCII 22> '<VERBOHACK> !,XSPCCHARS]>
<SETG INPUT-INT <ON "CHAR" ,CHARINT 8 0 ,INCHAN>>
'<SETG MORE-INT <ON "CHAR" ,MORE-HANDLE 8 0 ,OUTCHAN>>>
<DEFINE GET-TECO ("AUX" EDT FIL TEMP)
#DECL ((EDT) <LIST [REST TIME]> (FIL TEMP) STRING)
<PRINC "Please give the name of the TECO you desire: 'E', 'RMODE',
or whatever. ">
<PROG ()
<COND (<NOT <EMPTY? <SET TEMP <READER [] "Program name " "" ["LINE"] ,VERBOSE>>>>
<SET EDT <BUFLEX .TEMP ,DBRKS>>
<COND (<==? <LENGTH .EDT> 1>
<SET FIL <MYSIXTOS <1 .EDT>>>
<SETG TECO-PROGRAM .FIL>
<CRLF>
<PRINC "Using 'TS ">
<PRINC .FIL>
<PRINC "' as TECO">)
(T
<PRINC
"I can't understand that. Please type the name of the job to run,
e.g., TECO, EMACS, RMODE, etc.
">
<AGAIN>)>)>>>
<DEFINE CLEAR ()
<PRINC "C">
<COND (<ASSIGNED? QUESTION?>
<PQHEADER .QUESTION?>
<COND (<==? <NTH .QUESTION? ,QTYPE> ,$TMATCH>
<MATCH-PRINT <REST .QUESTION? ,QQUES>>)
(<==? <NTH .QUESTION? ,QTYPE> ,$TRANK>
<PRINC <NTH .QUESTION? <+ ,QQUES 4>>>
<CRLF>
<PRINC "Number to rank: ">
<PRIN1 <NTH .QUESTION? <+ ,QQUES 5>>>
<CRLF>
<SSTPOSSYM!-ICALSYM "" 0 <2 .TBL>>)
(<PRINC <NTH .QUESTION? <+ ,QQUES 1>>>)>)
(<ASSIGNED? Q.A>
<TERPRI>
<PRINC "Answer from ">
<PRINC <NTH .A ,AAUTH>>
<PRINC ": ">
<PRINC <NTH .A ,ARESP>>)>
<COND (<GASSIGNED? MATCH>
<TERPRI>
<PRINC "Match ">
<PRINC ,MATCH>)
(<ASSIGNED? MARKING>
<PRINC "
Score (out of ">
<PRIN1 .MARKING>
<PRINC ")">)>
<RETYPE-BUFFER!-ICALRDR T>>
<DEFINE CHARINT (CHR CHN)
#DECL ((CHR) CHARACTER (CHN) CHANNEL)
<INT-LEVEL 0>
<COND (<==? .CHR <ASCII 7>>
<COND (<MEMQ ,PLAYER ,WINNERS> <RECURSE> <DISMISS T>)
(,CTRLG-KILL <QUIT>)
(<DISMISS T>)>)
(<==? .CHR <ASCII 22>> <VERBOHACK>)
(<==? .CHR <ASCII 20>> <ANSHACK>)>>
<DEFINE MORE-HANDLE (X "OPTIONAL" Y "AUX" CHAR)
#DECL ((X) <OR FIX CHANNEL> (Y) CHANNEL (CHAR) CHARACTER)
<COND (<TYPE? .X FIX>)
(T
<PRINC "--More--" .X>
<COND (<==? <SET CHAR <TYI ,INCHAN>> !\ > <CRLF .X> <DISMISS T>)
(<AND <ASSIGNED? MORE-ACT> <LEGAL? MORE-ACT>>
<INT-LEVEL 0>
<PRINC "Flushed" .X>
<CRLF .X>
<DISMISS T .MORE-ACT>)
(<CRLF .X>
<DISMISS T>)>)>>
<DEFINE BUFHACK (BUF CHR)
#DECL ((CHR) CHARACTER (BUF) BUFFER)
<PRINC "C">
<AND <ASSIGNED? QUESTION?> <PQHEADER .QUESTION?>>
<COND (<ASSIGNED? qprompt> <PRINC .qprompt> <CRLF>)>
<COND (<ASSIGNED? bprompt> <PRINC .bprompt>)>
<COND (<ASSIGNED? aprompt>
<PRINC .aprompt>
<TERPRI>
<PRINC "Correct answer">)>
<AND ,VERBOSE <PRINC " (BUFFER): ">>
<IBUFPRINT .BUF <ASCII 4>>>
<SETG SCOREVEC <IVECTOR 2 0>>
<DEFINE GETQSCORE (QLOC "AUX" (SCWD <DATA-READW ,TVASS .QLOC>) (SV ,SCOREVEC))
#DECL ((QLOC) FIX (SCWD) WORD (SV) <VECTOR [2 <OR FIX FLOAT>]>)
<PUT .SV 1 <CHTYPE <GETBITS .SCWD <BITS 18 18>> FIX>>
<PUT .SV
2
</ <CHTYPE <GETBITS .SCWD <BITS 18 0>> FIX> 1000.000>>>
<DEFINE PQSCORE (QLOC QMAX
"OPTIONAL" (SV <GETQSCORE .QLOC>) (MX <* <1 .SV> .QMAX>)
"AUX")
#DECL ((QLOC) FIX (MX QMAX) <OR FIX FLOAT>
(SV) <VECTOR [2 <OR FIX FLOAT>]>)
<PRIN1 <1 .SV>>
<PRINC " players received ">
<PRIN1 <2 .SV>>
<PRINC " points of maximum ">
<PRIN1 .MX>
<PRINC " [">
<PRIN1 <FIX </ <* 100 <2 .SV>> .MX>>>
<PRINC "%]">
.SV>
<DEFINE GETSCORE (PLAYER "AUX" (TVA ,TVASS) (SSP ,SSPACE) NUTS WHR)
#DECL ((PLAYER) TIME (TVA) ASYLUM (SSP) SPACE (NUTS) LIST (WHR) FIX)
<SET WHR
<+ ,SCORE
<COND (<==? .PLAYER ,PLAYER> ,LUBLK)
(<SET NUTS <GET-LOSER .PLAYER>> <3 .NUTS>)>>>
<DATA-AREAD .TVA .WHR <ARESET .SSP T <>>>>
<DEFINE PSCORE (PLAYER
"AUX" SCUVEC (SSP ,SSPACE) (TVA ,TVASS) (N 1) (TOT 0) (SCTOT 0)
(QTOT 0) QTEMP QASKED LUBLK NSC NSC1 USLOT (TUV ,FOOUV) M
CODE VAL)
#DECL ((PLAYER) TIME (SCUVEC) UVECTOR (QTEMP QTOT N CODE) FIX
(TVA) ASYLUM (SSP) SPACE (TOT SCTOT) <OR FIX FLOAT>
(NSC NSC1) FLOAT (QASKED) <VECTOR [REST LIST]> (LUBLK USLOT) FIX
(TUV) <UVECTOR [4 FIX]> (VAL) <LIST [REST TIME STRING FIX FIX]>
(M) <OR FALSE <VECTOR [REST FIX STRING]>>)
<SET SCUVEC <GETSCORE .PLAYER>>
<SET LUBLK <3 <SET VAL <MEMQ .PLAYER ,LOSSTABLE>>>>
<SET USLOT <* 4 <4 .VAL>>>
<SET QASKED
<DATA-AREAD
.TVA
<+ .LUBLK
,QASKED>
.SSP>>
<MAPF <>
<FUNCTION (X)
#DECL ((X) <OR STRING FIX>)
<COND (<TYPE? .X STRING>
<CRLF>
<PRINC .X>
<INDENT-TO 19>
<PRIN1 <SET NSC <1 <1 .SCUVEC>>>>
<SET SCTOT <+ .SCTOT .NSC>>
<INDENT-TO 33>
<PRIN1 <SET NSC1 <2 <1 .SCUVEC>>>>
<SET TOT <+ .TOT .NSC1>>
<SET N <+ .N 1>>
<INDENT-TO 47>
<COND (<==? .NSC1 0.000> <PRINC "---">)
(T <PRIN1 </ .NSC .NSC1>>)>
<SET SCUVEC <REST .SCUVEC>>
<INDENT-TO 61>
<PRIN1 <SET QTEMP </ <LENGTH <1 .QASKED>> 2>>>
<SET QTOT <+ .QTEMP .QTOT>>
<SET QASKED <REST .QASKED>>)>>
<2 ,CATS>>
<CRLF>
<PRINC "Total of ">
<PRIN1 .SCTOT>
<PRINC " points out of ">
<PRIN1 .TOT>
<PRINC " [">
<PRIN1 <FIX </ <* 100 .SCTOT> .TOT>>>
<PRINC "%]. ">
<PRIN1 .QTOT>
<PRINC <COND (<1? .QTOT> " question.")
(t " questions.")>>
<CRLF>
<PRINC "Progress: ">
<PRIN1 <GETLASTQ .LUBLK>>
<PRINC " ">
<GET-LOC <+ ,PG ,PEEK-START .USLOT> .TUV>
<COND (<0? <1 .TUV>>
<PRINC "Playing: ">
<COND (<SET M
<MEMQ <CHTYPE <GETBITS <4 .TUV> <BITS 18 18>> FIX>
,STATUS-VECTOR>>
<PRINC <2 .M>>)
(<PRINC "??">)>
<COND (<OR <1? <SET CODE <1 .M>>> <==? .CODE 9>>
<COND (<0? <SET CODE
<CHTYPE <GETBITS <4 .TUV> <BITS 18>>
FIX>>>)
(<PRINC "#"> <PRIN1 .CODE>)>)
(<==? .CODE ,$SMAKE>
<COND (<0? <SET CODE
<CHTYPE <GETBITS <4 .TUV> <BITS 18>>
FIX>>>)
(<PRINC <NTH ,MAKETYPES .CODE>>)>)>)
(T
<PRINC "Last played on">
<PDSKDATE <CHTYPE <3 .TUV> WORD>>
<PRINC <ASCII 46>>)>>
<DEFINE GETLASTQ (LUBLK "AUX" (QSP ,QSPACE) Q LOWQ)
#DECL ((LOWQ LUBLK) FIX (Q) <OR FALSE <VECTOR FIX [REST ANY]>>
(QSP) SPACE)
<COND (<==? <SET LOWQ
<CHTYPE <DATA-READW ,TVASS <+ .LUBLK ,QNEXT>> FIX>>
,LOWQUES>
0)
(<SET Q <DATA-AREAD ,TVASS .LOWQ <ARESET .QSP T <>>>>
<QQNUM .Q>)>>
<DEFINE PDSKDATE (WD
"AUX" (TIM <CHTYPE <GETBITS .WD <BITS 18 0>> FIX>)
(A/P " AM ") HR)
#DECL ((WD) <PRIMTYPE WORD> (TIM HR) FIX (A/P) STRING)
<PRINC " ">
<COND (<0? <CHTYPE .WD FIX>>
<PRINC "unknown ">)
(T
<PRINC <NTH ,MONTHS <CHTYPE <GETBITS .WD <BITS 4 23>> FIX>>>
<PRINC " ">
<PRIN1 <CHTYPE <GETBITS .WD <BITS 5 18>> FIX>>
<PRINC " at ">
<SET HR </ .TIM 7200>>
<COND (<G=? .HR 12> <SET HR <- .HR 12>> <SET A/P " PM ">)>
<COND (<0? .HR> <SET HR 12>)>
<PRIN1 .HR>
<PRINC ":">
<SET HR </ <MOD .TIM 7200> 120>>
<COND (<L? .HR 10> <PRINC "0">)>
<PRIN1 .HR>
<PRINC .A/P>)>>
<SETG MONTHS
["January"
"February"
"March"
"April"
"May"
"June"
"July"
"August"
"September"
"October"
"November"
"December"]>
<GDECL (MONTHS) <VECTOR [12 STRING]>>
<DEFINE 6PRINC (FROB "AUX" (BITTBL ,6BIT))
#DECL ((FROB) <PRIMTYPE WORD> (BITTBL) <UVECTOR [REST BITS]>)
<REPEAT (CHAR) #DECL ((CHAR) FIX)
<SET CHAR <CHTYPE <GETBITS .FROB <1 .BITTBL>> FIX>>
<COND (<0? .CHAR> <RETURN .FROB>)
(T
<PRINC <CHTYPE <+ .CHAR 32> CHARACTER>>
<COND (<EMPTY? <SET BITTBL <REST .BITTBL>>>
<RETURN .FROB>)>)>>>
<PRINTTYPE TIME ,6PRINC>
<SETG 6BIT
<UVECTOR <BITS 6 30>
<BITS 6 24>
<BITS 6 18>
<BITS 6 12>
<BITS 6 6>
<BITS 6 0>>>
<SETG SCRATCH "MARCGR">
<GDECL (6BIT) <UVECTOR [6 BITS]> (PLAYER) TIME (SCRATCH) STRING>
<DEFINE MYSIXTOS (X "AUX" (S ,SCRATCH) (CT 0) (BIT ,6BIT))
#DECL ((X) <PRIMTYPE WORD> (CT) FIX (BIT) <UVECTOR [REST BITS]> (VALUE S) STRING)
<REPEAT (TCHAR)
#DECL ((TCHAR) FIX)
<COND (<0? <SET TCHAR <CHTYPE <GETBITS .X <1 .BIT>> FIX>>>
<RETURN <SUBSTRUC .S 0 .CT>>)
(T
<SET CT <+ .CT 1>>
<PUT .S .CT <CHTYPE <+ .TCHAR 32> CHARACTER>>
<COND (<EMPTY? <SET BIT <REST .BIT>>>
<RETURN <STRING .S>>)>)>>>
<DEFINE SQUOZE (SIXBIT
"AUX" (MULF <* 40 40 40 40 40 40>) (VAL 0) (COUNT 6) (TC 0)
(SBITS ,6BIT))
#DECL ((VAL COUNT TC MULF) FIX (SIXBIT) <PRIMTYPE WORD>
(SBITS) <UVECTOR [REST BITS]>)
<REPEAT ()
<COND (<OR <EMPTY? .SBITS> <L? .COUNT 1>>
<RETURN>)>
<SET TC <CHTYPE <GETBITS .SIXBIT <1 .SBITS>> FIX>>
<SET SBITS <REST .SBITS>>
<COND (<AND <G=? .TC 17> <L=? .TC 26>>
<SET TC <- .TC 16>>)
(<AND <G=? .TC 33> <L=? .TC 58>>
<SET TC <- .TC 22>>)
(<==? .TC <ASCII !\.>> <SET TC 37>)
(<==? .TC <ASCII !\$>> <SET TC 38>)
(<==? .TC <ASCII !\%>> <SET TC 39>)
(T <AGAIN>)>
<SET COUNT <- .COUNT 1>>
<SET VAL <+ .VAL <* .TC <SET MULF </ .MULF 40>>>>>>
<CHTYPE .VAL WORD>>
<DEFINE ANNOUNCE ("AUX" (ASP <ARESET ,ASPACE T <>>) (TVA ,TVASS) ANN)
#DECL ((TVA) ASYLUM (ASP) SPACE (ANN) STRING)
<COND (<AND <PRINC
"
[PLEASE ONLY MAKE ANNOUNCEMENTS IF REALLY NECESSARY
TYPE ALTMODE TO FLUSH THIS COMMAND]
">
<SET ANN <GETBUF "Announcement: " .ASP>>
<NOT <QUESTIONABLE? .ANN>>>
<CHAIN-APPEND .TVA
.ASP
<AVECTOR .ASP <DSKDATE> ,PLAYER .ANN>
,HIMAIL>)>>
<DEFINE READ.ANNOUNCE ("AUX" (TVA ,TVASS) (ASP <ARESET ,ASPACE T <>>) ANN
(NXT
<CHTYPE <DATA-READW .TVA <+ ,LUBLK ,ANNEXT>>
FIX>) DAT)
#DECL ((TVA) ASYLUM (NXT) FIX (ASP) SPACE (ANN) <OR FALSE VECTOR>
(DAT) <PRIMTYPE WORD>)
<REPEAT ()
<COND (<0? <SET NXT <CHTYPE <DATA-READW .TVA .NXT> FIX>>>
<RETURN>)
(<SET ANN <DATA-AREAD .TVA .NXT .ASP>>
<PRINC "
From ">
<6PRINC <2 .ANN>>
<PDSKDATE <1 .ANN>>
<CRLF>
<PRINC <3 .ANN>>
<SET DAT <DSKDATE>>
<COND (<==? <GETBITS .DAT <BITS 4 23>>
<GETBITS <1 .ANN> <BITS 4 23>>>
<AND <G? <- <CHTYPE <GETBITS .DAT <BITS 5 18>> FIX>
<CHTYPE <GETBITS <1 .ANN> <BITS 5 18>>
FIX>>
14>
<DELETE.ANNOUNCE .NXT>>)
(<G? <- <+ <CHTYPE <GETBITS .DAT <BITS 5 18>> FIX> 30>
<CHTYPE <GETBITS <1 .ANN> <BITS 5 18>> FIX>>
14>
<DELETE.ANNOUNCE .NXT>)>)>
<DATA-PRINTW .TVA <+ ,LUBLK ,ANNEXT> .NXT>>>
<DEFINE DELETE.ANNOUNCE (WHR "AUX" DAT LOC)
#DECL ((WHR LOC) FIX (DAT) <UVECTOR [4 WORD]>)
<SET DAT <DATA-FIND ,TVASS .WHR>>
<SET LOC <CHTYPE <NTH .DAT <+ ,NAMDATA 1>> FIX>>
<PUT .DAT 2 #WORD *000000000000*>
<PUT .DAT 3 #WORD *000000000000*>
<DATA-PUT ,TVASS .WHR .DAT>
<DATA-BLOCK-FREE ,TVASS .LOC>>
<DEFINE COMREP () <SNAME ,SPLAYER> <SETG SAVEREP ,REP> <SETG REP ,COMMAND>>
<DEFINE RECURSE () <COND (<MEMQ <CHTYPE <XUNAME> TIME> ,WINNERS>
<SETG REP ,SAVEREP>
<SNAME "MARC">
<LISTEN>
<SNAME ,SPLAYER>
<SETG REP ,COMMAND>)>>
<DEFINE ANSWER? ()
<OR ,ALWAYS-ANSWER
<PROG topask ()
#DECL ((topask) <SPECIAL ACTIVATION>)
<TRUE? "
Want the answer "
"Y/N"
"Yy"
"Nn"
<ASCII 20>>>>>
<DEFINE FLOATPRINT (FLT "AUX" DEC X1000)
#DECL ((FLT) FLOAT (DEC X1000) FIX)
<COND (<==? <MOD <SET X1000 <FIX <* 1000 .FLT>>> 10> 9>
<SET X1000 <+ .X1000 1>>)>
<PRIN1 </ .X1000 1000>>
<PRINC ".">
<SET DEC <MOD .X1000 1000>>
<AND <L? .DEC 100> <PRINC <ASCII 48> ;"Char 0">>
<AND <L? .DEC 10> <PRINC <ASCII 48> ;"Char 0">>
<PRINC .DEC>>
<PRINTTYPE FLOAT ,FLOATPRINT>
<OVERFLOW <>>
<DEFINE TVSAVE (VER DBG "OPTIONAL" (MODIF 0))
#DECL ((DBG) <OR 'T FALSE> (VER MODIF) FIX)
<CHAR-INIT>
<AND .DBG <DBG>>
<FUMP .VER ,SAVE .MODIF>>
<SETG QSYMS <MAKESST "QSYMS" []>>
<DEFINE Q-SYMS ("AUX" QPOSS (TVA ,TVASS) (CURSPACE <ARESET ,ASPACE T <>>) (IDX 1) WHR)
#DECL ((TVA) ASYLUM (CURSPACE) <SPECIAL SPACE> (WHR IDX) FIX
(QPOSS) <VECTOR [REST <LIST [REST FIX]>]>)
<COND
(<SET QPOSS <DATA-AREAD .TVA <+ ,LUBLK ,QASKED> .CURSPACE>>
<PUT
,QSYMS
2
<MAPF ,ALVECTOR
<FUNCTION (X "AUX" CATNM)
#DECL ((X) LIST (CATNM) STRING)
<AND <EMPTY? .X> <SET IDX <+ .IDX 1>> <MAPRET>>
<SET CATNM <NTH <2 ,CATS> <- <* .IDX 2> 1>>>
<REPEAT ((Y .X))
#DECL ((Y) LIST)
<COND (<EMPTY? .Y> <RETURN>)
(<SET WHR <1 .Y>>
<PUT .Y
1
<ASTRING .CURSPACE
.CATNM
"."
<UNPARSE <2 .Y>>>>
<PUT .Y 2 .WHR>
<SET Y <REST .Y 2>>)>>
<SET IDX <+ .IDX 1>>
<MAPRET !.X>>
.QPOSS>>)>>
<DEFINE GET.QUESTION ("OPTIONAL" (MULT <>) "AUX" SYMS SYMV)
#DECL ((SYMS) <OR FALSE SYMTABLE> (SYMV) <OR FALSE VECTOR>
(MULT) <OR FALSE 'T>)
<COND (<SET SYMS <Q-SYMS>>
<COND (<SET SYMV
<READARGS .SYMS
"Question "
'["" ""]
<COND (.MULT '["SYM" "MULT"]) ('["SYM"])>>>
<AND <NOT <EMPTY? <1 .SYMV>>> <1 .SYMV>>)>)
(<PERR "Can't get QUESTION SYMBOLS, Q-SYMS">)>>
<GDECL (SIMPLE-SPACE) SPACE>
<SETG MY-SIMPLE <MAKESST "SI1" []>>
<SETG HIS-SIMPLE <MAKESST "SI2" []>>
<SETG SIMTABLE <MAKEMST "SSS" [,MY-SIMPLE ,HIS-SIMPLE]>>
<SETG SIMTABLE? <>>
<GDECL (SIMTABLE MY-SIMPLE HIS-SIMPLE) SYMTABLE (SIMTABLE?) <OR ATOM FALSE>>
<DEFINE GET.SIMPLE ("OPTIONAL" (EVERYBODY? <>) "AUX" SYMV)
#DECL ((SYMV) <OR FALSE VECTOR> (EVERYBODY?) <OR ATOM FALSE>)
<COND (<NOT ,SIMTABLE?>
<LOAD.SIMPLE>)>
<COND (<SET SYMV
<READARGS <COND (.EVERYBODY? ,SIMTABLE)
(T ,MY-SIMPLE)>
"Question "
'["" ""]
<COND (.EVERYBODY? '["SYM" "MULT"]) ('["SYM"])>>>
<AND <NOT <EMPTY? <1 .SYMV>>> <1 .SYMV>>)>>
<DEFINE LOAD.SIMPLE ("AUX" (TVA ,TVASS)
(CURSPACE
<COND (<GASSIGNED? SIMPLE-SPACE>
<ARESET ,SIMPLE-SPACE T <>>)
(T <SETG SIMPLE-SPACE <AFIND 1>>)>)
(SISP ,SIMPLE-SPACE) SLIST (PLAYER ,PLAYER)
(SPLAYER ,SPLAYER))
#DECL ((CURSPACE) <SPECIAL SPACE> (TVA) ASYLUM
(SLIST) <LIST [REST TIME FIX FIX]> (SISP) SPACE (PLAYER) TIME
(SPLAYER) STRING)
<SET SLIST <DATA-AREAD .TVA ,SIMPLE-LIST .SISP>>
<PUT ,MY-SIMPLE
2
<MAPR ,ALVECTOR
<FUNCTION (X "AUX" (Y <1 .X>)) #DECL ((X) <LIST [REST <PRIMTYPE WORD>]>)
<COND (<==? .Y .PLAYER>
<MAPRET <ASTRING .SISP
.SPLAYER
<ASCII 46> ;"Char ."
<UNPARSE <2 .X>>>
<3 .X>>)
(<MAPRET>)>>
.SLIST>>
<PUT ,HIS-SIMPLE
2
<MAPR ,ALVECTOR
<FUNCTION (X "AUX" (Y <1 .X>)) #DECL ((X) <LIST [REST <PRIMTYPE WORD>]>)
<COND (<AND <TYPE? .Y TIME>
<N==? .Y .PLAYER>>
<MAPRET <ASTRING .SISP <MYSIXTOS .Y> <ASCII 46> <UNPARSE <2 .X>>>
<3 .X>>)
(<MAPRET>)>>
.SLIST>>
<SETG SIMTABLE? T>>
<DEFINE PRINT.QSCORE ("OPTIONAL" (PRINT? T) (VERBOSE? <>)
"AUX" (TVA ,TVASS) (QSP ,QSPACE) (PL 0) (PS 0.000)
(MX 0.000) SYML)
#DECL ((SYML) <OR FALSE <LIST [REST SYMBOL]>> (TVA) ASYLUM (QSP) SPACE
(PS MX) FLOAT (PL) FIX (PRINT? VERBOSE?) <OR ATOM FALSE>)
<COND
(<SET SYML <GET.QUESTION T>>
<CRLF>
<PROG MORE-ACT
()
#DECL ((MORE-ACT) <SPECIAL ACTIVATION>)
<RESET ,INCHAN>
<MAPF <>
<FUNCTION (X "AUX" FROB QUES)
#DECL ((X) SYMBOL (QUES) VECTOR
(FROB) <VECTOR [2 <OR FIX FLOAT>]>)
<SET QUES <DATA-AREAD .TVA <2 .X> <ARESET .QSP T <>>>>
<COND (.PRINT?
<PQHEADER .QUES>
<COND (.VERBOSE? <PRINT-QUESTION .QUES>)
(T <PRINC <NTH .QUES <+ ,QQUES 1>>>)>
<CRLF>
<CRLF>
<SET FROB
<PQSCORE <NTH .QUES ,QSCORE> <NTH .QUES ,QVAL>>>
<CRLF>
<PRINC "------">)
(<SET FROB <GETQSCORE <NTH .QUES ,QSCORE>>>)>
<SET PL <+ .PL <1 .FROB>>>
<SET PS <+ .PS <2 .FROB>>>
<SET MX <+ .MX <* <NTH .QUES ,QVAL> <1 .FROB>>>>>
.SYML>
<AND <NOT <LENGTH? .SYML 1>>
<CRLF>
<PRINC "
Total for all questions...">
<CRLF>>
<OR <AND <LENGTH? .SYML 1> <OR .PRINT? .VERBOSE?>>
<PQSCORE 0 0 <VECTOR .PL .PS> .MX>>>)>>
<DEFINE PSCORES ("AUX" SYMV)
#DECL ((SYMV) <OR FALSE VECTOR>)
<SET-STATUS ,$SPSCORE>
<COND (<SET SYMV
<READARGS <P-SYMS> "for " '["" ""] '["SYM" "MULT"]>>
<PROG MORE-ACT
()
#DECL ((MORE-ACT) <SPECIAL ACTIVATION>)
<RESET ,INCHAN>
<MAPF <>
<FUNCTION (X)
#DECL ((X) SYMBOL)
<PRINC "
Score for ">
<PRINC <1 .X>>
<INDENT-TO 19>
<PRINC
"Points Possible Average Questions">
<CRLF>
<PSCORE <CHTYPE <STRTOX <1 .X>> TIME>>
<CRLF>>
<1 .SYMV>>>)>>
<DEFINE GETBUF (bprompt "OPTIONAL" (SP ,QSPACE) qprompt SPROMPT "AUX" BUF)
#DECL ((qprompt bprompt) <SPECIAL STRING> (SPROMPT) <OR FALSE STRING>
(BUF) <SPECIAL BUFFER> (SP) SPACE)
<TERPRI>
<SET BUF <BUFMAKE 20>>
<AND <ASSIGNED? SPROMPT>
.SPROMPT
<ADDSTRING .BUF .SPROMPT>>
<REPEAT ()
<COND (,VERBOSE <GETSTR .BUF .CHRTABLE .bprompt " (BUFFER):">)
(<GETSTR .BUF .CHRTABLE .bprompt>)>
<COND (,BUFSAFE <AND <CONFIRM> <RETURN>>) (<RETURN>)>>
<ACOPY .SP <BUFTOS .BUF>>>
<DEFINE CONFIRM ()
<PRINC "[confirm]">
<AND <RESET ,INCHAN> <==? <TYI> <ASCII 27>>>>
<DEFINE PLAY-BALL ("AUX"
(TAILOR
<DATA-AREAD ,TVASS <+ ,LUBLK ,TAILOR> <ARESET ,SSPACE T <>>>)
SWITCHES (SEQUENCE ,SEQUENCE))
#DECL ((TAILOR) <OR FALSE <UVECTOR [3 WORD]>> (SEQUENCE SWITCHES) WORD)
<COND (<NOT .TAILOR>)
(T
<SET SEQUENCE <SETG SEQUENCE <SEQ-WORD .TAILOR>>>
<SET SWITCHES <SWITCH-WORD .TAILOR>>
<MAPF <>
<FUNCTION (BT SW)
#DECL ((BT) BITS (SW) ATOM)
<COND (<==? <GETBITS .SWITCHES .BT> #WORD *000000000000*>
<SETG .SW <>>)
(<SETG .SW T>)>>
,BIT-TABLE
,SWITCH-TABLE>
<COND (<0? <SETG TELEC-INTERVAL
<CHTYPE <GETBITS .SWITCHES ,RIGHT-HALF> FIX>>>)
(<TELECON ,TELEC-INTERVAL>)>
<SETG TECO-PROGRAM <MYSIXTOS <TECO-WORD .TAILOR>>>)>
<MAPF <>
<FUNCTION (BT "AUX" COD)
#DECL ((BT) BITS (COD) FIX)
<COND (<0? <SET COD <CHTYPE <GETBITS .SEQUENCE .BT> FIX>>>
<MAPLEAVE T>)
(<PRINC <NTH ,FROB-NAMES .COD>>
<EVAL <NTH ,FROBS .COD>>)>>
,SEQ-BITS>
<COMMAND>>
<SETG SWITCH-TABLE
'[VERBOSE ALWAYS-ANSWER PNEWMAIL IGNORE-SIMPLE KEEPASKING BUFSAFE]>
<SETG BIT-TABLE
'[#BITS *430100000000*
#BITS *420100000000*
#BITS *410100000000*
#BITS *400100000000*
#BITS *370100000000*
#BITS *360100000000*]>
<SETG RIGHT-HALF <BITS 18 0>>
<MANIFEST RIGHT-HALF>
<DEFINE SAVE-TAILOR ("AUX" (SWITCH #WORD 0) (SEQ ,SEQUENCE)
(SSP <ARESET ,SSPACE T <>>))
#DECL ((SEQ SWITCH) WORD (SSP) SPACE)
<MAPF <>
<FUNCTION (BT SW)
#DECL ((BT) BITS (SW) ATOM)
<SET SWITCH <PUTBITS .SWITCH .BT <COND (,.SW 1) (0)>>>>
,BIT-TABLE
,SWITCH-TABLE>
<SET SWITCH
<PUTBITS .SWITCH
,RIGHT-HALF
,TELEC-INTERVAL>>
<DATA-APRINT ,TVASS
<+ ,LUBLK ,TAILOR>
.SSP
<AUVECTOR .SSP
.SEQ
.SWITCH
<CHTYPE <STRTOX ,TECO-PROGRAM> WORD>>>>
<DEFINE GET-SEQUENCE ("AUX" SEQ (S #WORD *000000000000*))
#DECL ((SEQ) <OR FALSE <VECTOR LIST>> (S) WORD)
<UNWIND
<PROG ()
<SETG COMPLETES " ,">
<COND (<SET SEQ
<READARGS ,SEQ-SYMS "will be " '["" ""] '["SYM" "MULT"]>>
<MAPF <>
<FUNCTION (BT SYM)
#DECL ((BT) BITS (SYM) <PRIMTYPE VECTOR>)
<SET S <PUTBITS .S .BT <2 .SYM>>>>
,SEQ-BITS
<1 .SEQ>>
<SETG SEQUENCE .S>)>
<SETG COMPLETES " ">>
<SETG COMPLETES " ">>>
<SETG SEQ-SYMS
<MAKEBST "SS"
["Answer"
1
"Babble"
2
"DDT.babble"
3
"Grade"
4
"Make"
5
"Peek"
6
"Print.score"
7
"Quit"
8
"Read.mail"
9
"Status.of.question"
10
"Summary.status.of.question"
11
"Tiny.babble"
12
"Twhois"
13]>>
<DEFINE SET-STATUS (CODE "OPTIONAL" (FROB 0) "AUX" (PG ,PG) (TU ,TUV))
#DECL ((PG CODE FROB) FIX (TU) <UVECTOR [4 FIX]>)
<COND (<GASSIGNED? TINDEX>
<PUT-LOC <+ ,PEEK-START .PG ,TINDEX>
<PUT .TU 4 <PUTBITS .FROB <BITS 18 18> .CODE>>>)>>
<SETG TOBRKS " ,
">
<SETG DBRKS ",./
">
<GDECL (TOBRKS DBRKS) STRING>
<DEFINE BUFLEX (S "OPTIONAL" (BRKS ,TOBRKS) "AUX" (LL (<CHTYPE 0 TIME>))
(L .LL) (S1 .S))
#DECL ((S S1 BRKS) STRING (VALUE LL L) <LIST [REST TIME]>)
<REPEAT ()
<COND (<OR <EMPTY? .S1> <MEMQ <1 .S1> .BRKS>>
<AND
<N==? .S .S1>
<PUTREST
.L
<SET L
(<CHTYPE <STRTOX <SUBSTRUC
.S
0
<- <LENGTH .S> <LENGTH .S1>>>> TIME>)>>>
<AND <EMPTY? .S1> <RETURN <REST .LL>>>
<SET S <REST .S1>>)>
<SET S1 <REST .S1>>>>
<SETG MAKETYPES
["ZORK!"
"long answer"
"matching"
"M.C."
"T/F"
"ZORK!"
"simple"
"ZORK!"
"ranking"]>
;"POINTER TO START OF USER BLOCK FOR USER FOO
SETG'S FOO TO THAT FIX"
<DEFINE UBLOCK (STR "OPTIONAL" (L ,LOSSTABLE) M)
#DECL ((STR) STRING (L) LIST (M) <OR LIST FALSE>)
<COND (<GASSIGNED? <PARSE .STR>> ,<PARSE .STR>)
(<SET M <MEMQ <CHTYPE <STRTOX .STR> TIME> .L>>
<SETG <PARSE .STR> <3 .M>>)>>
<SETG ERRFLAG <>>
<GDECL (ERRFLAG) <OR ATOM FALSE>>
<DEFINE HANDLE (EFRM "TUPLE" JUNK "AUX" VAL TLIST TTY-HEADER)
#DECL ((EFRM) FRAME (JUNK) TUPLE (VAL) FIX
(TLIST) <OR FALSE <LIST [REST TIME STRING FIX FIX]>>
(TTY-HEADER) IHEADER)
<COND
(,ERRFLAG
<PRINC "ERROR in error handler.">
<QUIT>)
(,CTRLG-KILL
<SETG ERRFLAG T>
<DISABLE <SET TTY-HEADER <GET ,INCHAN INTERRUPT!- >>>
<INT-LEVEL 100000>
<PRINC "*ERROR*">
<CRLF>
<MAPF <>
<FUNCTION (X)
<PRIN1 .X>
<CRLF>>
.JUNK>
<PRINC "ERROR during startup.">
<COND (<SEND-ERROR "STARTUP ERROR" .JUNK>
<VALRET ":GENJOB
:DISOWN
">
<ENABLE .TTY-HEADER>
<OFF ,ERRH>)
(T
<CRLF>
<PRINC "TRIVIA suicided.">
<QUIT>)>)
(<AND <==? <LENGTH .JUNK> 3>
<==? <1 .JUNK> UNASSIGNED-VARIABLE!-ERRORS>
<==? <3 .JUNK> GVAL>>
<COND (<AND <GASSIGNED? LOSSTABLE>
<SET TLIST
<MEMQ <CHTYPE <STRTOX <SPNAME <2 .JUNK>>> TIME>
,LOSSTABLE>>>
<SETG <2 .JUNK> <SET VAL <3 .TLIST>>>
<INT-LEVEL 0>
<ERRET .VAL .EFRM>)>)
(<OR <==? ,PLAYER <CHTYPE <STRTOX "TAA"> TIME>>
<==? ,PLAYER <CHTYPE <STRTOX "MARC"> TIME>>>
<SETG REP ,SAVEREP>
<SNAME "MARC">)>>
<DEFINE AFIXCHOMP ("AUX" TTY-HEADER)
#DECL ((TTY-HEADER) IHEADER)
<DISABLE <SET TTY-HEADER <GET ,INCHAN INTERRUPT!- >>>
<CLOSE <OPEN "PRINT" "_MSGS_;TRIVIA DEATH">>
<CRLF>
<PRINC "GROSS LOSSAGE">
<CRLF>
<PRINC "TRIVIA is down. Please tell other triviators to go away,
then use TVBUG to describe EXACTLY what you were doing.">
<CRLF>
<VALRET ":GENJOB
:DISOWN
:TVBUG
">
<ENABLE .TTY-HEADER>
<OFF ,ERRH>
<LISTEN>>
<DEFINE SYSDOWN (DWNTIME) #DECL ((DWNTIME) FIX)
<COND (<L? .DWNTIME 0>
<CRLF>
<PRINC "ITS revived!">
<CRLF>
<AND <==? ,FLUSH SYSDOWN> <SETG FLUSH <>>>)
(T
<SETG FLUSH SYSDOWN>)>>
<AND <NOT <LOOKUP "COMPILE" <ROOT>>>
<NOT <LOOKUP "GLUE" <GET PACKAGE OBLIST>>>
<SETG ERRH <HANDLER <GET ERROR!-INTERRUPTS INTERRUPT> ,HANDLE>>
<SETG SYSDOWNH <HANDLER <EVENT "SYSDOWN" 1> ,SYSDOWN>>>
<DEFINE PLAY ("OPTIONAL" (PLAYER <>) "AUX" FOO TINDEX LUBLK)
#DECL ((PLAYER) <OR STRING FALSE> (FOO) <OR FALSE FIX> (TINDEX LUBLK) FIX)
<COND (<MEMQ <CHTYPE <XUNAME> TIME> ,WINNERS>
<COND (<NOT .PLAYER>
<SET PLAYER <READER '[] "as " "" '["LINE"] <>>>)>
<COND (<SET FOO <UBLOCK .PLAYER>>
<SET TINDEX <* 4 <4 <MEMQ <CHTYPE <STRTOX .PLAYER> TIME>
,LOSSTABLE>>>>
<COND (<DHLOCK <+ .TINDEX ,PEEK-START ,PG>>
<DUNLOCK <+ ,TINDEX ,PEEK-START ,PG>>
<SETG TINDEX .TINDEX>
<SETG LUBLK .FOO>
<SETG PLAYER <CHTYPE <STRTOX .PLAYER> TIME>>
<PUT ,TUV 2 <CHTYPE ,PLAYER FIX>>
.PLAYER)
(T <PRINC "Already playing">)>)
(T <PRINC "You blew it, champ.">)>)>>
<DEFINE UNLOCK-PLAYER (NAME "AUX" (L <MEMQ <CHTYPE <STRTOX .NAME> TIME> <NEW-LOSS>>)
TINDEX TEMP)
#DECL ((L) <OR FALSE <LIST [REST TIME STRING FIX FIX]>> (NAME) STRING
(TINDEX TEMP) FIX)
<COND (.L
<SET TINDEX <4 .L>>
<SET TEMP <+ ,PEEK-START
<SETG PG <* .PG 1024>>
<* .TINDEX 4>>>
<COND (<0? <1 <GET-LOC .TEMP ,NTTUV>>>
<OR <DUNLOCK .TEMP>
<PUT-LOC .TEMP ![-1]>>
T)
(T
#FALSE ("ALREADY UNLOCKED"))>)
(#FALSE ("NOT A PLAYER"))>>
<DEFINE RDELETE (FOO "AUX" (DC ,TVASS) (S <ARESET ,ASPACE T <>>)
(ZORK <ALIST .S 1>) FWEEP)
#DECL ((FOO) <OR FIX <LIST [REST FIX]>> (DC) ASYLUM (S) SPACE (ZORK) LIST
(FWEEP) <OR <FALSE FIX> <PRIMTYPE VECTOR>>)
<COND (<TYPE? .FOO FIX>
<COND (<SET FWEEP <DATA-DELETE .DC .FOO>>)
(<==? <1 .FWEEP> 8>
<DATA-APRINT .DC .FOO .S .ZORK>
<DATA-DELETE .DC .FOO>)>)
(T
<MAPF <>
<FUNCTION (X) #DECL ((X) FIX)
<COND (<SET FWEEP <DATA-DELETE .DC .X>>)
(<==? <1 .FWEEP> 8>
<DATA-APRINT .DC .X .S .ZORK>
<DATA-DELETE .DC .X>)>>
.FOO>)>>