"MAIN for
SUSPENSION
(c) Copyright 1983 Infocom, Inc. All Rights Reserved.
"
Set if the parser successfully parsed a command. (As opposed to a blank line or an error.)
No relation to whether the player has won.
The turn on which the food and transit systems go haywire. This is synced with I-TREMOR2, which displays the message about damage to those systems.
RTD-KILLS is normally 75, but is reduced to 2 in ADVANCED mode. (A few places in the code compare MOVES to the literal 75 instead of RTD-KILLS. This probably means bugs in ADVANCED mode.)
<GLOBAL ACID-KILLS 15>
<GLOBAL PEOPLE-APPEAR 100>
<CONSTANT M-FATAL 2>
<CONSTANT M-HANDLED 1>
<CONSTANT M-NOT-HANDLED <>>
<CONSTANT M-BEG 1>
<CONSTANT M-OBJECT <>>
<CONSTANT M-END 6>
<CONSTANT M-ENTER 2>
<CONSTANT M-LOOK 3>
<CONSTANT M-FLASH 4>
<CONSTANT M-OBJDESC 5>
Set up the world at the start of the game. Start the timers. Print the banner. Set all those useful globals like HERE and WINNER. Do the inital ARL command.
;"put interrupts on clock chain"
;"set up and go"
<SETG LIT T>
<SETG ORANGESET ,ORANGECABLE>
<ENABLE <QUEUE I-TREMOR1 ,ACID-KILLS>>
<ENABLE <QUEUE I-PEOPLE1 ,PEOPLE-APPEAR>>
<ENABLE <QUEUE I-AUDA-HINTS ,PEOPLE-APPEAR>>
<ENABLE <QUEUE I-WIRE-MESSAGE -1>>
<ENABLE <QUEUE I-ROBOTKILLER -1>>
<ENABLE <QUEUE I-IRIS-HINTS -1>>
<SETG P-IT-OBJECT <>>
<SETG WINNER-HERE ,CPU-ROOM>
<COND (<NOT <FSET? ,WINNER-HERE ,TOUCHBIT>>
<CRLF>)>
<CHANGE-WINNER ,IRIS T>
<AGAIN>>
<ROUTINE CHANGE-WINNER (OBJ "OPTIONAL" (TEMP? <>) "AUX" L)
<COND (<AND <==? .OBJ ,WINNER>
<NOT .TEMP?>>
<TELL "FC: Cryolink already established to " SD ,WINNER "." CR>
<RTRUE>)>
<DEAD-FCN .OBJ>
<RFALSE>)>
<SETG WINNER .OBJ>
<SETG OLD-WINNER <>>
<SETG WINNER-HERE <COND (<IN? <SET L <LOC .OBJ>> ,ROOMS> .L)
(T <LOC .L>)>>
<COND (<NOT .TEMP?>
<TELL "FC: Cryolink established to ">
<TELL SD ,WINNER "." CR>)>
<COND (<IRIS?> <SETG NUM-EXT 2>)
(<WALDO?> <SETG NUM-EXT 6>
<COND (<FSET? ,SURGERY-HAND ,WEARBIT> <SETG NUM-EXT 7>)>)
(<SENSA?> <SETG NUM-EXT 3>)
(<AUDA?> <SETG NUM-EXT 1>)
(<POET?> <SETG NUM-EXT 3>)
(<WHIZ?> <SETG NUM-EXT 2>)>
<RTRUE>>
<ROUTINE MAIN-LOOP ("AUX" ICNT OCNT NUM CNT OBJ TBL V PTBL OBJ1 TMP)
#DECL ((CNT OCNT ICNT NUM) FIX (V) ANY (OBJ) <OR FALSE OBJECT>
(OBJ1) OBJECT (TBL) TABLE (PTBL) <OR FALSE ATOM>)
<REPEAT ()
<SET CNT 0>
<SET OBJ <>>
<SET PTBL T>
<SET ICNT <GET ,P-PRSI ,P-MATCHLEN>>
<SET NUM
<COND (<0? <SET OCNT <GET ,P-PRSO ,P-MATCHLEN>>> .OCNT)
(<G? .OCNT 1>
<SET TBL ,P-PRSO>
<COND (<0? .ICNT> <SET OBJ <>>)
(T <SET OBJ <GET ,P-PRSI 1>>)>
.OCNT)
(<G? .ICNT 1>
<SET PTBL <>>
<SET TBL ,P-PRSI>
<SET OBJ <GET ,P-PRSO 1>>
.ICNT)
(T 1)>>
<COND (<AND <NOT .OBJ> <1? .ICNT>> <SET OBJ <GET ,P-PRSI 1>>)>
(<0? .NUM>
<SETG PRSO <>>)
(<VERB? $TELL>
<TELL
"FC: I don't understand with which robot you wish to form a cryolink." CR>
<SET V <>>)
(T
<TELL <GET ,ROBOT-NAMES ,ROFF> ": "
<COND (,P-OFLAG
<PRINTB <GET .TMP 0>>)
(T
<WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>
<TELL "!" CR>
<SET V <>>)>)
(<AND <G? .NUM 1> <==? ,PRSA ,V?$TELL>>
<SETG P-CACTOR 1>
<SETG P-OPLEN <GETB ,P-LEXV ,P-LEXWORDS>>
<SET CNT 1>
<PUT ,P-ACTORS 0 .NUM>
<REPEAT ()
<COND (<G? .CNT .NUM> <RETURN>)
(T
<PUT ,P-ACTORS
.CNT
<COND (<IN? <SET OBJ <GET ,P-PRSO .CNT>>
<REAL-ROBOT .OBJ>)
(T .OBJ)>>)>
<SET CNT <+ .CNT 1>>>
<COND (,P-TWOBOTS
<SETG P-NACTORS 1>
<COND (<ALL-THERE?>
;<CLOCKER>
<NOT
7>
7>>
<TELL "FC: That's absurd!" CR>
<AGAIN>)
(ELSE
<TELL
"FC: Dual-Cryolink established to ">
<TELL SD <1 ,P-ACTORS> " and "
SD <2 ,P-ACTORS> "." CR>
<SETG ROFF 0>
<SETG WINNER-HERE
<LOC <1 ,P-ACTORS>>>)>)
(T
<TELL
"FC: The robots are in different places." CR>
<AGAIN>)>)
(T
<SETG P-NACTORS .NUM>
<SETG OLD-WINNER <>>)>)
(T
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .NUM> <RETURN>)
(T
<COND (.PTBL <SET OBJ1 <GET ,P-PRSO .CNT>>)
(T <SET OBJ1 <GET ,P-PRSI .CNT>>)>
<COND (<G? .NUM 1>
<TELL "(" D .OBJ1 ") ">)>
<SETG PRSO <COND (.PTBL .OBJ1) (T .OBJ)>>
<SETG PRSI <COND (.PTBL .OBJ) (T .OBJ1)>>
<COND (<==? .V ,M-FATAL> <RETURN>)>)>>)>
<COND (<==? .V ,M-FATAL>
<SETG P-CONT <>>
<SETG P-NACTORS 0>)>)
(<G? ,P-NACTORS 1> T)
(T
<SETG P-NACTORS 0>
<SETG P-CONT <>>)>
<COND (,P-WON
<COND (<VERB? SAVE RESTORE $TELL VERSION SCORE ADVANCED CONFIGURE IMPOSSIBLE QUIT RESTART SCRIPT UNSCRIPT> T)
(T
<SET V <CLOCKER>>)>)>>>
<GLOBAL NOT-CLEAR <PLTABLE
"I don't see what you mean to"
"I can't tell which object to"
"I have no good sense of what to"
"I don't hear what you mean to"
"I can't imagine what you intend to"
"The CLC doesn't understand what to">>
<ROUTINE TICK ()
<CLOCKER>>
<ROUTINE ALL-THERE? ("AUX" (CNT 1) MAX RM)
<SET MAX <GET ,P-PRSO ,P-MATCHLEN>>
<SET RM <LOC <GET ,P-PRSO 1>>>
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .MAX> <RTRUE>)
(<NOT <EQUAL? <LOC <GET ,P-PRSO .CNT>> .RM>>
<RFALSE>)>>>
<GLOBAL L-PRSA <>>
<GLOBAL L-PRSO <>>
<GLOBAL L-PRSI <>>
<ROUTINE PERFORM (A "OPTIONAL" (O <>) (I <>) "AUX" V OA OO OI)
#DECL ((A) FIX (O) <OR FALSE OBJECT FIX> (I) <OR FALSE OBJECT> (V) ANY)
<SET OA ,PRSA>
<SET OO ,PRSO>
<SET OI ,PRSI>
<COND (<AND <EQUAL? ,IT .I .O>
<NOT <EQUAL? ,P-IT-LOC ,WINNER-HERE>>>
<TELL "FC: I don't see what you are referring to." CR>
<RFATAL>)>
<COND (<==? .O ,IT> <SET O ,P-IT-OBJECT>)>
<COND (<==? .I ,IT> <SET I ,P-IT-OBJECT>)>
<SETG PRSA .A>
<SETG PRSO .O>
<COND (<AND ,PRSO <NOT <VERB? WALK>>>
<SETG P-IT-OBJECT ,PRSO>
<SETG P-IT-LOC ,WINNER-HERE>)>
<SETG PRSI .I>
<COND (<GAME-COMMAND? .A>
<SET V <APPLY <GET ,ACTIONS .A>>>)
(<SET V <APPLY <GET ,PREACTIONS .A>>> .V)
(<AND .I <SET V <APPLY <GETP .I ,P?ACTION>>>> .V)
(<AND .O
<NOT <==? .A ,V?WALK>>
<LOC .O>
<SET V <APPLY <GETP <LOC .O> ,P?CONTFCN>>>>
.V)
(<AND .O
<NOT <==? .A ,V?WALK>>
<SET V <APPLY <GETP .O ,P?ACTION>>>>
.V)
(<SET V <APPLY <GET ,ACTIONS .A>>> .V)>
<COND (<NOT <==? .V ,M-FATAL>>
<SETG PRSA .OA>
<SETG PRSO .OO>
<SETG PRSI .OI>
.V>
<ROUTINE GAME-COMMAND? (ACT)
<COND (<OR <EQUAL? .ACT ,V?SCORE ,V?SAVE ,V?RESTORE>
<EQUAL? .ACT ,V?QUIT ,V?VERSION ,V?$VERIFY>
<EQUAL? .ACT ,V?ADVANCED>>
<RTRUE>)>>
<ROUTINE BEGINNING ()
<TELL
"FC ALERT! Planetside systems are deteriorating. FC imbalance detected. Emergency reviving systems completed. You are now in control of the complex.|
|
SENSA INTERRUPT: Seismic aftershock detected ten meters north of Beta FC. Tremor intensity 9.7. Projected damage: connecting cables in Primary and Secondary Channels.|
|
FC INTERRUPT: All Robots, report locations.|
|">>
Set up the LAST-ROOM table (all robot locations) at the beginning of play.
<REPEAT ()
<SET COUNT <+ .COUNT 1>>
<COND (<EQUAL? .COUNT 8>
<RETURN>)>