.FUNCT GO START:: ?FCN: CALL2 INIT-STATUS-LINE,TRUE-VALUE SET 'LIT,TRUE-VALUE PUTB P-LEXV,0,59 PUTB YES-LEXV,0,4 SET 'WINNER,PLAYER CALL QUEUE,I-PROMPT,1 PUT STACK,0,1 CALL1 INTRO FSET HERE,SEENBIT CALL1 START-MOVEMENT CALL1 V-LOOK CALL1 MAIN-LOOP JUMP ?FCN .FUNCT INTRO,N SET 'HERE,GAME PRINTI "Copyright (c) 1985 Infocom, Inc. All rights reserved. Welcome to " PRINTD GAME PRINTI " (TM) - interactive fiction from Infocom! " PRINTI "[Note to testers: this story has the command GO TO, and the concept of not being able to see things behind your back. The unit of currency in this story is the Frotzian slimpuk, whose symbol is """ PRINTC CURRENCY-SYMBOL PRINTI """. Messages in square brackets [] will not be in the final release. Remember: you can shorten your words only to NINE (9) letters. But you can use C for COMPARTMENT, V for VESTIBULE, and F for FORWARD.] " PRINTI "Do you want the viewpoint of the traveler or the spy? " CALL READ-WORD,W?TRAVELER,W?SPY,W?T,W?S,W?TRAVELLER >N EQUAL? N,W?SPY,W?S \?ELS11 SET 'VARIATION,3 JUMP ?CND9 ?ELS11: SET 'VARIATION,1 ?CND9: PRINTI "Do you want the short variation or the long one? " CALL READ-WORD,W?SHORT,W?LONG,W?S,W?L >N PRINTI "Then let the story begin!" CRLF EQUAL? N,W?L,W?LONG \?CND23 INC 'VARIATION CALL ZMEMZ,MCGUFFIN,BRIEFCASE-TBL PUT BRIEFCASE-TBL,STACK,0 FSET MCGUFFIN,NDESCBIT FCLEAR MCGUFFIN,TAKEBIT ?CND23: CALL1 TAKE-YOUR-PLACES EQUAL? VARIATION,2,4 \?CND26 MOVE MCGUFFIN,LIMBO-REAR ?CND26: CALL1 START-TRAIN CLEAR 0 EQUAL? VARIATION,3,4 \?ELS31 REMOVE BOND MOVE BOND-OTHER,HERE CALL QUEUE,I-BOND-OTHER,-1 PUT STACK,0,1 PRINTI "Why did you want to be a spy anyway? You could have had a nice restful job, like an air-traffic controller. You could have tended flowers behind a white picket fence around your country cottage. At least they could let you grab a few winks between one job and the next. But no -- you finish debriefing in some dirty little city in Frotzerland, and before you can even find a phone book, let alone a hotel, they volunteer you for another assignment. ""You've got to intercept " CALL2 PRINTA,MCGUFFIN PRINTI "!"" they told you. ""Then deliver it to our agent in Gola so the leak can be traced. We don't know where it is for sure, but we think it's in a briefcase that's leaving town on the next train. You're the only agent that's close enough and experienced enough to be sent after it. And at the end of the trip, there will be a plane ticket to home waiting for you."" So that's why you're climbing all over this stupid train. Finding the briefcase was easy enough, but the dude carrying it was something else. Even your well-placed bullet didn't make him drop. Now, if only he'll take the bait and follow you up here, you can .... Wait! Here he comes from the forward end! But he's not carrying the case! " JUMP ?CND29 ?ELS31: PRINTI "With your business deal behind you, you want only to get out of this bleak corner of Eastern Europe. The frontier is now only a few hours away, and from there it's not far to Vienna, and civilization.... The ride seems endless, and you're dozing off again. The wheels of the train are ticking like a clock, ticking off the segments of track you're passing, and the compartment is rocking you back and forth, back and forth, making your eyelids slowly close. Your slumber is cut short as a man staggers into your compartment, panting strangely. From his demeanor, you guess that he has drunk too much. But before you can dismiss him, you notice that he's grasping a bright red spot on his shirt. He speaks quietly, but in a hurry. ""I've got only a moment, so listen carefully! Since you were reading the International Herald over lunch, I assume you're an American. I am an agent of our government, and I've been sent to " EQUAL? VARIATION,2,4 \?ELS40 PRINTI "pick up some kind of " PRINTD MCGUFFIN PRINTI " in Frbz and take it" JUMP ?CND38 ?ELS40: PRINTI "deliver a " PRINTD MCGUFFIN ?CND38: PRINTI " to our special agent in Gola. An enemy agent spotted me on the train, and I only barely managed to escape."" He groans softly, examining his wound. ""The best I can do now is throw the enemy off the scent, but I need you, and your country needs you, to carry out my assignment."" You start to interrupt, a thousand questions racing through your mind. ""There's no time! Here! Take my briefcase, but be careful with it! Our enemies are all around us! My contact in " EQUAL? VARIATION,2,4 \?ELS51 PRINTD STATION-FRBZ JUMP ?CND49 ?ELS51: PRINTD STATION-GOLA ?CND49: PRINTI " is " CALL2 PRINTA,CONTACT PRINTI ", and I was to display " EQUAL? VARIATION,2,4 /?CND58 CALL2 PRINTA,PASSOBJECT PRINTI ", then use the word" EQUAL? PASSWORD,CAMERA,HANKY,SCARF \?CND63 PRINTI "s" ?CND63: PRINTI " '" PRINTD PASSWORD PRINTI "' " ?CND58: PRINTI "...."" Then he stops and listens. Before you can say anything, he checks the corridor and races out. " CALL QUEUE,I-BOND,1 PUT STACK,0,1 ?CND29: CALL1 V-VERSION CRLF CALL1 INIT-STATUS-LINE RSTACK .FUNCT READ-WORD,WD1,WD2,WD3=0,WD4=0,WD5=0,N,L ?FCN: PRINTI ">" READ P-INBUF,P-LEXV GETB P-LEXV,P-LEXWORDS ZERO? STACK \?CND3 CALL PLEASE-TYPE-OR,WD1,WD2 JUMP ?FCN ?CND3: SET 'L,P-LEXSTART ?PRG6: GET P-LEXV,L >N CALL WT?,N,PS?BUZZ-WORD ZERO? STACK \?CND8 JUMP ?REP7 ?CND8: ADD L,P-LEXELEN >L JUMP ?PRG6 ?REP7: EQUAL? N,WD1,WD2 /?THN14 EQUAL? N,WD3,WD4,WD5 \?CND11 ?THN14: RETURN N ?CND11: CALL WT?,N,PS?VERB,P1?VERB >N EQUAL? N,ACT?QUIT \?ELS18 QUIT CALL1 TELL-FAILED JUMP ?FCN ?ELS18: EQUAL? N,ACT?RESTART \?ELS20 RESTART CALL1 TELL-FAILED JUMP ?FCN ?ELS20: EQUAL? N,ACT?$VERIFY \?ELS22 CALL1 V-$VERIFY JUMP ?FCN ?ELS22: EQUAL? N,ACT?RELEASE \?ELS24 CALL1 V-VERSION JUMP ?FCN ?ELS24: EQUAL? N,ACT?RESTORE \?CND16 CALL1 V-RESTORE ZERO? STACK /?FCN CALL1 TELL-FAILED JUMP ?FCN ?CND16: CALL PLEASE-TYPE-OR,WD1,WD2 JUMP ?FCN .FUNCT PLEASE-TYPE-OR,WD1,WD2 PRINTI "Please type """ PRINTB WD1 PRINTI """ or """ PRINTB WD2 PRINTI """. " RTRUE .FUNCT RANDOM-PER-VAR,L,N MUL VARIATION,L DIV STACK,MAX-VAR ADD 1,STACK >N GRTR? N,L \?ELS5 RETURN L ?ELS5: RETURN N .FUNCT TAKE-YOUR-PLACES,P,N,L,?TMP1 PUTP WAITER,P?CAR,DINER-CAR PUTP COOK,P?CAR,DINER-CAR CALL2 PICK-ONE,CAR-ROOMS-COMPS >COMPARTMENT-START EQUAL? VARIATION,3,4 \?CND1 ADD 1,CAR-START >CAR-HERE ?CND1: CALL2 TAKE-YOUR-PLACES-CAST,EXTRA-TABLE CALL2 TAKE-YOUR-PLACES-CAST,SPY-TABLE CALL TAKE-YOUR-PLACES-CAST,MARKS-TABLE,FALSE-VALUE,FALSE-VALUE,FALSE-VALUE GET SPY-TABLE,0 CALL2 RANDOM-PER-VAR,STACK GET SPY-TABLE,STACK >BAD-SPY GETP BAD-SPY,P?CHARACTER >BAD-SPY-C GETP BAD-SPY,P?ACTION >BAD-SPY-DEFAULT-F EQUAL? VARIATION,3,4 /?ELS6 SET 'HERE,COMPARTMENT-START CALL2 GENERIC-SEAT-F,0 >PLAYER-SEATED MOVE BLOOD-SPOT,HERE MOVE BRIEFCASE,PLAYER-SEATED PUTP BRIEFCASE,P?CAR,CAR-HERE PUTP BAD-SPY,P?ACTION,BAD-SPY-F ADD 1,CAR-START PUTP BAD-SPY,P?CAR,STACK MOVE BAD-SPY,OTHER-ROOF JUMP ?CND4 ?ELS6: SET 'HERE,ROOF PUTP PLAYER,P?CAR,CAR-HERE MOVE BRIEFCASE,BAD-SPY PUTP BRIEFCASE,P?CAR,CAR-START FCLEAR BRIEFCASE,TAKEBIT SET 'N,0 GET BRIEFCASE-TBL,0 >L ?PRG9: IGRTR? 'N,L \?ELS13 JUMP ?REP10 ?ELS13: GET BRIEFCASE-TBL,N >P ZERO? P /?PRG9 FCLEAR P,TAKEBIT JUMP ?PRG9 ?REP10: RANDOM 6 ADD 9,STACK CALL QUEUE,I-TRAVELER-TO-GRNZ,STACK PUT STACK,0,1 PUTP BAD-SPY,P?ACTION,TRAVELER-F PUTP BAD-SPY,P?CAR,CAR-START PUTP BAD-SPY,P?LDESC,35 GETP COMPARTMENT-START,P?OTHER >L MOVE BAD-SPY,L SET 'BAD-SPY-DONE-PEEKING,TRUE-VALUE MOVE BLOOD-SPOT,L FCLEAR GUN,NDESCBIT FSET GUN,TAKEBIT MOVE GUN,POCKET ?CND4: MOVE PLAYER,HERE SET 'LAST-CAR-HERE,CAR-HERE ADD 1,CONTACT-MAX >?TMP1 CALL2 RANDOM-PER-VAR,CONTACT-MAX SUB ?TMP1,STACK GET EXTRA-TABLE,STACK >CONTACT GETP CONTACT,P?ACTION >CONTACT-DEFAULT-F PUTP CONTACT,P?ACTION,CONTACT-F EQUAL? VARIATION,2,4 \?CND16 CALL1 MOVE-CONTACT PUTP TICKET,P?CAPACITY,STATION-WIEN PUTP TICKET-OTHER,P?CAPACITY,STATION-WIEN SET 'LATCH-TURNED,FALSE-VALUE CALL PICK-ONE-NOT,SPY-TABLE,BAD-SPY >PICKPOCKET CALL PICK-ONE-NOT,SPY-TABLE,BAD-SPY >PEEKER ADD 2,CAR-START PUTP PEEKER,P?CAR,STACK MOVE PEEKER,OTHER-VESTIBULE-REAR GETP PEEKER,P?CHARACTER GET GOAL-TABLES,STACK PUT STACK,GOAL-ENABLE,1 CALL ESTABLISH-GOAL-TRAIN,PEEKER,VESTIBULE-FWD,1 PUTP PEEKER,P?LDESC,PEEKING-CODE ?CND16: CALL1 SET-PASSES RSTACK .FUNCT SET-PASSES,NUM=0,L,N,P SET 'PASSWORD-GIVEN,FALSE-VALUE SET 'PASSWORD-GIVEN-OTHER,FALSE-VALUE SET 'PASSOBJECT-GIVEN,FALSE-VALUE SET 'PASSOBJECT-GIVEN-OTHER,FALSE-VALUE ZERO? NUM /?CND1 FSET SPY-LIST,MUNGBIT ?CND1: SET 'L,6 ADD NUM,VARIATION >P GET PASS-TABLE,P >PASSOBJECT CALL2 RANDOM-PER-VAR,L ADD NUM,STACK >N EQUAL? P,N \?CND4 IGRTR? 'N,L \?CND4 SET 'N,1 ?CND4: GET PASS-TABLE,N >PASSWORD RETURN PASSWORD .FUNCT TAKE-YOUR-PLACES-CAST,TBL,NEW?=0,STA-ONLY?=0,PEOPLE?=1,P,OBJ,N,L,M,X GET TBL,0 >P GET CAR-ROOMS,0 >M ?PRG1: GET TBL,P >OBJ ZERO? PEOPLE? /?CND3 FSET OBJ,LOCKED ?CND3: RANDOM M GET CAR-ROOMS,STACK >L RANDOM CAR-MAX >N EQUAL? N,DINER-CAR,FANCY-CAR \?CND7 DEC 'N ?CND7: ZERO? PEOPLE? \?ELS12 JUMP ?CND10 ?ELS12: ZERO? NEW? \?ELS14 EQUAL? L,COMPARTMENT-START \?ELS14 EQUAL? N,CAR-START \?ELS14 DEC 'N JUMP ?CND10 ?ELS14: CALL ZMEMQ,L,CAR-ROOMS-REST ZERO? STACK /?CND10 FSET? OBJ,PLURALBIT /?THN22 CALL OCCUPIED?,L,N ZERO? STACK /?ELS21 ?THN22: GETPT L,P?OUT GET STACK,REXIT >L JUMP ?CND10 ?ELS21: EQUAL? N,CAR-HERE \?ELS25 CALL FIND-FLAG-LG,L,DOORBIT FSET STACK,LOCKED JUMP ?CND10 ?ELS25: CALL FIND-FLAG-LG,L,DOORBIT FCLEAR STACK,LOCKED ?CND10: ZERO? PEOPLE? /?THN31 CALL TAKE-YOUR-PLACE-TEST,OBJ,STA-ONLY? ZERO? STACK /?CND28 ?THN31: EQUAL? N,CAR-HERE,DINER-CAR,FANCY-CAR \?ELS35 MOVE OBJ,L JUMP ?CND33 ?ELS35: GETP L,P?OTHER >X ZERO? X /?CND33 MOVE OBJ,X ?CND33: PUTP OBJ,P?CAR,N ?CND28: ZERO? NEW? /?CND38 ZERO? PEOPLE? /?CND38 CALL ZMEMQ,OBJ,EXTRA-TABLE >X ZERO? X /?CND43 GET EXTRA-SEEN-TABLE,X SUB 0,STACK PUT EXTRA-SEEN-TABLE,X,STACK ?CND43: EQUAL? OBJ,BAD-SPY /?CND38 FCLEAR OBJ,SEENBIT FCLEAR OBJ,TOUCHBIT PUTP OBJ,P?LDESC,0 ?CND38: DLESS? 'P,1 \?PRG1 RTRUE .FUNCT TAKE-YOUR-PLACE-TEST,OBJ,STA-ONLY?,X EQUAL? OBJ,CONTACT /FALSE CALL IN-MOTION?,OBJ,TRUE-VALUE ZERO? STACK \FALSE CALL2 META-LOC,OBJ CALL ZMEMQ,STACK,STATION-ROOMS >X ZERO? STA-ONLY? /?ELS10 RETURN X ?ELS10: ZERO? X /TRUE RFALSE .FUNCT OCCUPIED?,L,N EQUAL? L,GAS-CAR-RM \?ELS3 EQUAL? N,GAS-CAR /TRUE ?ELS3: EQUAL? N,CAR-HERE,DINER-CAR,FANCY-CAR /?CND1 GETP L,P?OTHER >L ?CND1: CALL FIND-FLAG-CAR,L,N,PERSONBIT RSTACK .FUNCT MOVE-CONTACT,N SUB PLATFORM-MAX,1 RANDOM STACK ADD 1,STACK >N PUTP CONTACT,P?CAR,N GET STATION-ROOMS,N MOVE CONTACT,STACK FSET CONTACT,NDESCBIT FCLEAR CONTACT,TOUCHBIT PUTP CONTACT,P?LDESC,10 RTRUE .FUNCT INIT-STATUS-LINE,FIRST=0 GETB 0,18 ZERO? STACK /TRUE ZERO? FIRST /?CND4 CLEAR -1 SPLIT 2 ?CND4: SCREEN 1 BUFOUT FALSE-VALUE CALL2 INVERSE-LINE,1 HLIGHT H-INVERSE ZERO? FIRST /?ELS10 GETB 0,33 SUB STACK,10 DIV STACK,2 CURSET 1,STACK PRINTD GAME JUMP ?CND8 ?ELS10: CURSET 1,1 PRINTI "You are " CURSET 1,63 PRINTI "It is now " ?CND8: SET 'PLAYER-NOT-FACING-OLD,99 BUFOUT TRUE-VALUE HLIGHT H-NORMAL SCREEN 0 RTRUE .FUNCT INVERSE-LINE,LIN,CNT=79 CURSET LIN,1 HLIGHT H-INVERSE CALL2 PRINT-SPACES,CNT HLIGHT H-NORMAL RTRUE .FUNCT PRINT-SPACES,CNT ?PRG1: DLESS? 'CNT,0 /TRUE PRINTC 32 JUMP ?PRG1 .FUNCT STATUS-LINE,LEN,X=0 GETB 0,18 ZERO? STACK /TRUE EQUAL? LAST-PLAYER-LOC,HERE \?THN7 EQUAL? PLAYER-NOT-FACING-OLD,PLAYER-NOT-FACING \?THN7 EQUAL? PLAYER-SEATED-OLD,PLAYER-SEATED /?CND4 ?THN7: SET 'X,TRUE-VALUE ?CND4: ZERO? X \?CND9 ZERO? CLOCK-WAIT \TRUE ?CND9: BUFOUT FALSE-VALUE SCREEN 1 HLIGHT H-INVERSE ZERO? X /?CND16 SET 'LAST-PLAYER-LOC,HERE SET 'PLAYER-NOT-FACING-OLD,PLAYER-NOT-FACING SET 'PLAYER-SEATED-OLD,PLAYER-SEATED DIROUT -1 DIROUT 3,SL-BUFFER CALL1 TELL-LOCATION DIROUT -3 DIROUT 1 GET SL-BUFFER,0 >LEN CURSET 1,9 CALL1 TELL-LOCATION SUB 54,LEN CALL2 PRINT-SPACES,STACK ?CND16: CURSET 1,73 CALL2 TIME-PRINT,PRESENT-TIME PRINTI ". " SCREEN 0 BUFOUT TRUE-VALUE HLIGHT H-NORMAL RTRUE .FUNCT TELL-LOCATION,DIR EQUAL? HERE,UNCONSCIOUS \?CND1 PRINTI "unconscious." RTRUE ?CND1: ZERO? PLAYER-SEATED \?ELS8 JUMP ?CND6 ?ELS8: LESS? 0,PLAYER-SEATED \?ELS10 PRINTI "sitting " JUMP ?CND6 ?ELS10: PRINTI "lying " ?CND6: FSET? HERE,SURFACEBIT \?ELS19 PRINTI "on" JUMP ?CND17 ?ELS19: EQUAL? HERE,BESIDE-TRACKS /?CND17 PRINTI "in" ?CND17: CALL2 PRINTT,HERE ZERO? PLAYER-NOT-FACING /?CND28 PRINTI ", facing " CALL2 OPP-DIR,PLAYER-NOT-FACING >DIR EQUAL? DIR,P?EAST \?ELS35 ZERO? ON-TRAIN /?ELS35 PRINTI "the right side" JUMP ?CND28 ?ELS35: EQUAL? DIR,P?WEST \?ELS41 ZERO? ON-TRAIN /?ELS41 PRINTI "the left side" JUMP ?CND28 ?ELS41: CALL2 DIR-PRINT,DIR ?CND28: PRINTI "." RTRUE .ENDI