10  REM *** MADLIBS *** WRITTEN BY DAVE KAUFMAN, AUGUST '74
20  REM *** COPYRIGHT, PEOPLE'S COMPUTER CO. ***
30  REM *** 1919 MENALTO AVE, MENLO PARK, CA.  94025 ***
40  REM
100  REM * DECLARE STRING VARIABLES
110  REM * A$ TO O$ ARE OUSED BY THE STORIES FOR PLAYER INPUT
112  REM * X$ AND Y$ ARE USED BY THE MAIN PROGRAM
120  DIM A$[30],B$[30],C$[30],D$[30],E$[30],F$[30],G$[30],H$[30],I$[30]
130  DIM J$[30],K$[30],L$[30],M$[30],N$[30],O$[30]
140  DIM X$[72],Y$[72]
150  REM * Q HOLDS A QUEUE OF STORIES, WAITING TO BE USED.
152  REM     Q(1,1)       Q(1,2)
154  REM     Q(2,1)       Q(2,2)
156  REM     Q(3,1)       Q(O3,2)
158  REM     Q(4,1)       Q(4,2)
160  REM
162  REM * THE FIRST COLUMN HOLDS THE STORY #S IN THE 'READY' QUEUE
164  REM * (THE NEXT  RANDOM  STORY GETS CHOSEN FROM THIS QUEUE)
166  REM * AND THE SECOND COLUMN HOLDS THE 'WAIT QUEUE'
168  REM * (WHEN A STORY IS CHOSEN FROM THE 'READY' QUEUE, IT GETS
170  REM * PUT INTO THE 'WAIT' QUEUE NEXT, AND WAITS ITS TURN.  THE
172  REM * 'WAIT' QUEUE MOVES UP IN ORDER, THE TOP ONE GOING INTO
174  REM * THE 'READY' QUEUE)
180  DIM Q[4,2]
190  GOSUB 600
200  REM * TALK TO PERSON AND FIND OUT WHICH STORY TO USE
210  PRINT "HELLO. THIS IS THE MADLIB PROGRAM TYPING."
220  PRINT 
230  PRINT "THERE ARE SEVERAL STORIES IN THIS PROGRAM.  YOU CAN"
240  PRINT "GET ONE PICKED AT RANDOM, OR CHOOSE ONE YOURSELF."
250  PRINT 
260  PRINT "WHICH DO YOU WANT - CHOOSE OR RANDOM ";
270  INPUT X$
280  IF X$[1,1]="C" THEN 400
290  IF X$[1,1]="R" THEN 300
292  PRINT "'CHOOSE' MEANS "'7'7'7"YOU PICK A STORY (YOU CAN ASK FOR A MENU)"
294  PRINT "'RANDOM' MEANS "'7'7'7"YOU WON'T KNOW WHAT YOU'RE GETTING"
296  GOTO 260
300  REM * THIS SECTION PICKS A RANDOM STORY FROM THE 'READY' QUEUE
302  REM * BEFORE RUNNING THE STORY, IT UPDATES THE 'WAIT' QUEUE
304  REM * SO THIS STORY WON'T BE CHOSEN AGAIN FOR AWHILE
310  Q0=INT(4*RND(0))+1
320  S=Q[Q0,1]
330  GOSUB 800
340  GOSUB 900
350  GOTO 250
400  REM * THIS SECTION ASKS THE PERSON TO CHOOSE A STORY
410  PRINT 
412  PRINT "WHICH STORY NUMBER (TYPE A  0  TO GET A MENU) ";
414  INPUT S
416  IF S#0 THEN 420
418  GOSUB 700
419  GOTO 410
420  IF S <= S9 AND S >= 1 AND INT(S)=S THEN 430
422  PRINT "SORRY, BUT THAT AIN'T A STORY NUMBER"
424  PRINT "(HINT: TYPE A  0  TO GET THE FULL LIST)"
426  GOTO 412
430  REM & NOW, FIX THE 'READY' AND 'WAIT' QUEUES
440  REM FIRST, SEE IF IT'S IN THE 'READY' QUEUE
442  FOR Q0=1 TO 4
444  IF Q[Q0,1]=S THEN 470
446  NEXT Q0
450  REM STORY NUMBER ISN'T THERE, SO CHECK THE 'WAIT' QUEUE
452  FOR Q0=1 TO 4
454  IF Q[Q0,2]=S THEN 460
456  NEXT Q0
460  FOR Q1=Q0 TO 3
462  Q[Q1,2]=Q[Q1+1,2]
464  IF Q[Q1,2]=0 THEN 468
466  NEXT Q1
468  Q[Q1,2]=S
469  GOTO 480
470  REM FOUND STORY # IN 'READY' QUEUE, SO CALL THE REGULAR SUBROUTINE !
472  GOSUB 800
480  REM NOW THAT THE QUEUES HAVE BEEN UPDATED, RUN STORY, THEN LOOP BACK
490  GOSUB 900
492  GOTO 250
500  REM *** SUBROUTINES START HERE ***
510  REM * THIS SUBROUTINE RESTORES THE DATA POINTER TO A PARTICULAR STORY
520  REM S IS THE # OF THE STORY TO READ FROM
530  GOTO S OF 540,544,548,552,556,560,564,566
540  RESTORE 1000
542  RETURN 
544  RESTORE 2000
546  RETURN 
548  RESTORE 3000
550  RETURN 
552  RESTORE 4000
554  RETURN 
556  RESTORE 5000
558  RETURN 
560  RESTORE 6000
562  RETURN 
564  RESTORE 7000
566  RETURN 
568  RESTORE 8000
570  RETURN 
600  REM * THIS SUBROUTINE READS THE STORY NUMBERS INTO  MAT Q
602  REM * AND FINDS THE TOTAL # OF STORIES
610  REM S9 IS THE TOTAL # OF STORIES
620  MAT Q=ZER
622  FOR S=1 TO 8
624  GOSUB 500
626  READ Y$
628  IF Y$="*" THEN 640
630  Q[S-4*INT(S/5),1+INT(S/5)]=S
632  NEXT S
640  S9=S-1
650  IF S9<5 THEN 670
660  RETURN 
670  PRINT "THERE MUST BE AT LEAST 5 STORIES IN THIS PROGRAM."
680  PRINT "ALL THERE ARE IS";S9;"STORIES.   BYE !"
690  STOP 
700  REM * THIS SUBROUTINE PRINTS ALL STORY TITLES
710  PRINT 
712  PRINT "HERE'S THE MENU :"
714  PRINT 
720  FOR S=1 TO S9
722  GOSUB 500
724  READ Y$
726  PRINT S;Y$
728  NEXT S
730  RETURN 
800  REM * THIS SUBROUTINE PUTS THE NUMBER OF THE CURRENT STORY ON THE
802  REM * BOTTOM OF THE 'WAIT' QUEUE.  IT THEN MOVES THE STORY ON TOP
804  REM * OF THE 'WAIT' QUEUE INTO THE 'READY' QUEUE.
810  REM S IS THE NUMBER OF THE CURRENT STORY
812  REM Q0 IS ITS POSITION IN THE 'READY' QUEUE
820  Q[Q0,1]=Q[1,2]
830  FOR Q1=1 TO 3
832  Q[Q1,2]=Q[Q1+1,2]
834  IF Q[Q1,2]=0 THEN 840
836  NEXT Q1
840  Q[Q1,2]=S
850  RETURN 
900  REM * THIS SUBROUTINE RUNS THE SELECTED STORY
910  GOSUB 500
911  I=0
912  REM SKIP TO QUERIES BY READING TITLE
914  READ Y$
920  REM FIRST, GET ALL QUERIES FOR INPUT
922  READ Y$
924  IF Y$="*" THEN 991
926  PRINT Y$;
928  I=I+1
930  GOTO I OF 932,936,940,944,948,952,956,960,964,968,972,976,980,984,988
932  INPUT A$
934  GOTO 990
936  INPUT B$
938  GOTO 990
940  INPUT C$
942  GOTO 990
944  INPUT D$
946  GOTO 990
948  INPUT E$
950  GOTO 990
952  INPUT F$
954  GOTO 990
956  INPUT G$
958  GOTO 990
960  INPUT H$
962  GOTO 990
964  INPUT I$
966  GOTO 990
968  INPUT J$
970  GOTO 990
972  INPUT K$
974  GOTO 990
976  INPUT L$
978  GOTO 990
980  INPUT M$
982  GOTO 990
984  INPUT N$
986  GOTO 990
988  INPUT O$
990  GOTO 920
991  REM NOW, PRINT TITLE & GOSUB THE STORY - LET IT RUN ITSELF !
992  GOSUB 500
993  READ Y$
994  PRINT LIN(-5);TAB((45-LEN(Y$))/2);Y$
995  PRINT LIN(-3)
996  GOSUB S OF 1000,2000,3000,4000,5000,6000,7000,8000
999  RETURN 
1000  REM *** WEATHER ***
1002  REM * FIRST, THE TITLE
1010  DATA "WEATHER REPORT"
1020  REM * SECOND, THE QUERIES FOR INPUT
1030  DATA "GIVE ME A PLACE"
1040  DATA "GIVE ME A TEMPERATURE"
1050  DATA "NOW I NEED A ~VERB"
1060  DATA "WHAT IS YOUR NAME"
1499  DATA "*"
1500  REM * AND THIRD, THE STORY GETS PRINTED OUT
1502  PRINT "   GOOD EVENING, TV VIEWERS.  THIS IS THE EVENING"
1510  PRINT "WEATHER REPORT FOR ";A$;" AND VICINITY."
1512  PRINT 
1520  PRINT "THE ";B$;" WILL BE WARM, AND THE HUMIDITY IN THE LOW"
1530  PRINT "30'S.  THERE WILL BE A SLIGHT RAIN THAT WILL ";C$
1540  PRINT "AND THAT IS ALL."
1550  PRINT 
1560  PRINT "   SIGNING OFF FOR KLMN TV, THIS IS ";D$
1999  RETURN 
2000  REM *** STAR TREK ***
2002  REM * FIRST, THE TITLE
2010  DATA "STAR TREK INTRODUCTION"
2020  REM * SECOND, THE QUERIES FOR INPUT
2030  DATA "I NEED A FAMOUS NAME"
2040  DATA "WHAT WOULD YOU LIKE TO DO MOST OF ALL "
2050  DATA "LEAST OF ALL "
2060  DATA "GIVE ME A NAME "
2070  DATA "AND A DATE"
2080  DATA "A NAME OF A DISTANT PLACE"
2090  DATA "THE NAME OF YOUR BEST FRIEND"
2499  DATA "*"
2500  REM * AND THIRD, THE STORY GETS PRINTED OUT
2502  PRINT "SPACE, THE FINAL FRONTIER"
2510  PRINT "THESE ARE THE VOYAGES OF THE STARSHIP ";A$
2520  PRINT "ITS FIVE-YEAR MISSION : ";B$
2530  PRINT "TO SEEK OUT NEW LIFE AND NEW CIVILIZATIONS,"
2540  PRINT "TO ";C$;". . ."
2542  PRINT "TO BOLDLY GO WHERE NO MAN HAS GONE BEFORE . . . "
2550  PRINT 
2560  PRINT TAB(15);"S"'7" T"'7" A"'7" R"'7"    T"'7" R"'7" E"'7" K"'7"  "'7'7'7'7'7'7'7'7
2570  PRINT 
2580  PRINT "CAPTAIN ";D$;":  CAPTAIN'S LOG, STARDATE ";E$
2590  PRINT 
2600  PRINT "   WE ARE RESPONDING TO A DISTRESS CALL FROM THE"
2610  PRINT "SCIENTIFIC EXPEDITION TO ";F$
2620  PRINT 
2630  PRINT "CAPTAIN ";D$;":  LIEUTENANT ";G$;", PLEASE TAKE OVER"
2640  PRINT "          THE HELM WHILE MR. SPOCK AND I BEAM DOWN"
2650  PRINT "          TO INVESTIGATE."
2660  PRINT 
2670  PRINT TAB(5);"C"'7" O"'7" M"'7" M"'7" E"'7" R"'7" C"'7" I"'7" A"'7" L"'7"    B"'7" R"'7" E"'7" A"'7" K"'7"  "'7'7'7'7'7'7'7'7
2999  RETURN 
3000  REM *** COMPUTER TALK ***
3002  REM * FIRST, THE TITLE
3010  DATA "COMPUTER TALK"
3020  REM * SECOND, THE QUERIES FOR INPUT
3030  DATA "I NEED A WORD FOR SOMETHING BIG "
3040  DATA "NOW A WORD FOR A LITTLE ONE "
3050  DATA "GIVE ME A SHORT, SECRET MESSAGE "
3060  DATA "WHAT'S ANOTHER WORD FOR 'PREPARE' "
3070  DATA "WHO WOULD PREPARE IT "
3080  DATA "ANOTHE WORD FOR MESSAGE "
3090  DATA "A PERSON IN CHARGE IS CALLED A . . . "
3100  DATA "GIVE ME A NUMBER "
3110  DATA "ANOTHER NUMBER "
3120  DATA "SOMETHING VERY IMPORTANT "
3130  DATA "I NEED AN ACTION WORD "
3499  DATA "*"
3500  REM * AND THIRD, THE STORY GETS PRINTED OUT
3510  PRINT "   THE 3-BIT ";A$;" GENERATES THE CONTROL SIGNALS"
3520  PRINT "FOR THE ";B$;" BY A DECODING OF THE ";C$;"."
3530  PRINT "IT IS LOADED AND ";D$;" BY A ";E$;" AND THEREFORE"
3540  PRINT "THE TIMING OF I/O ";F$;" IS UNDER ";G$;"."
3550  PRINT 
3560  PRINT "   THERE ARE "H$;" OUTPUT MODES AND ";I$;" INPUT MODES."
3570  PRINT "THE HIGH ORDER "I$;" OF THE REGISTER IS THE INPUT FLAG."
3580  PRINT "WHEN THIS ";J$;" IS A 1-BIT, THE ";J$;" IS"
3590  PRINT "SUBSTITUTED FOR THE ";A$;", THUS PROVIDING A SOURCE"
3600  PRINT "OF DATA WHEN ";K$;" AND EXTERNAL I/O ";F$;"."
3999  RETURN 
4000  REM *** HOW TO <BLANK> YOUR FIRST <BLANK> PROGRAM ***
4002  REM * FIRST, THE TITLE
4010  DATA "HOW TO <BLANK> YOUR FIRST <BLANK> PROGRAM"
4020  REM * SECOND, THE QUERIES FOR INPUT
4030  DATA "GIVE ME A VERB RELATED TO MOTION "
4040  DATA "GIVE ME A WORD WHICH MEANS APPROVAL "
4050  DATA "NOW A WORD FOR A HEAVY MACHINE "
4060  DATA "HOW ABOUT SOMETHING LIGHT "
4070  DATA "NOW A WORD FOR MECHANICAL CONNECTIONS OR FORCES "
4080  DATA "SOMETHING YOU LIKE ALOT "
4090  DATA "AND SOMETHING YOU HATE "
4499  DATA "*"
4500  REM * AND THIRD, THE STORY GETS PRINTED OUT
4510  PRINT "   FIRST, YOU HAVE TO LOGON THE ";C$;".  ONCE YOU"
4520  PRINT "HAVE ";E$;" THE ";G$;" WORD, THEN "A$;" THE"
4530  PRINT "NOUN."
4540  PRINT 
4550  PRINT "   NEXT, SCRATCH THE ";C$;" AND ENTER YOUR ";D$;"."
4560  PRINT "ONCE ENOUGH ";D$;"S ARE ENTERED, IT'S TIME TO"
4570  PRINT A$;" YOUR ";C$;" UNTIL YOU LOOP THE ";F$;" OR"
4580  PRINT E$;"ED YOUR ";B$;" PROGRAM."
4999  RETURN 
5000  REM *** HOW TO WIN FRIENDS AND INFLUENCE PEOPLE ***
5002  REM * FIRST, THE TITLE
5010  DATA "HOW TO WIN FRIENDS AND INFLUENCE PEOPLE"
5030  REM * SECOND, THE QUERIES FOR INPUT
5040  DATA "NAME SOMETHING YOU'VE ALWAYS WANTED TO DO "
5050  DATA "NOW A PART OF A PERSON "
5060  DATA "ANOTHER PART OF A PERSON "
5070  DATA "GIVE ME A 1-WORD EXCLAMATION "
5080  DATA "WHAT'S THE BEST WORD FOR A BAD DAY "
5090  DATA "A TYPE OF PERSON "
5100  DATA "AN ACTION WORD "
5110  DATA "I NEED EVEN ANOTHER PART OF A PERSON "
5120  DATA "A DESCRIPTIVE WORD "
5130  DATA "NAME SOMETHING "
5140  DATA "WHAT DO PEOPLE DO "
5150  DATA "SOMETHING THAT PEOPLE NOTICE "
5160  DATA "SOMETHING YOU LIKE TO DO "
5170  DATA "ANOTHER THING YOU "'7"DON'T LIKE TO DO "
5499  DATA "*"
5500  REM * AND THIRD, THE STORY GETS PRINTED OUT
5510  PRINT "   TO CHANGE PEOPLE YOU MUST ";A$;" WITH THEM."
5520  PRINT "THERE ARE A NUMBER OF WAYS TO GO ABOUT CHANGING"
5530  PRINT "A PERSON'S ";B$;".  WALK UP TO THEM ON THE STREET,"
5540  PRINT "GRAB THEM BY THE ";C$;" AND YELL '";D$;"!!!', YOU"
5550  PRINT E$;" ";F$;"! OR CATCH THEM ASLEEP AND WHISPER,"
5560  PRINT "'";G$;", ";G$;", ";G$;"' IN THEIR ";H$
5570  PRINT "OR SET YOURSELF UP AS A ";I$;" ";J$;" AND"
5580  PRINT "PRETTY SOON PEOPLE WILL START TO ";K$;"."
5590  PRINT "TO WORK THIS ALTERNATIVE, THOUGH, YOU MUST EITHER"
5600  PRINT "HAVE A ";L$;" YOU CAN CHANGE SOCIETY WITH, OR"
5610  PRINT "DO A ";M$;" OR A ";N$;".  BUT ONLY IF YOU AREN'T"
5620  PRINT "MISTAKEN FOR A ";E$;" ";F$;"."
5999  RETURN 
6000  REM *** ATOP THE NARGOIDS ***
6002  REM * FIRST, THE TITLE
6010  DATA "ATOP THE NARGOIDS"
6020  REM * SECOND, THE QUERIES FOR INPUT
6499  DATA "*"
6500  REM * AND THIRD, THE STORY GETS PRINTED OUT
6999  RETURN 
7000  REM *** EMPTY STORY ***
7999  DATA "*"
8000  REM *** EMPTY STORY ***
8999  DATA "*"
9999  END 
