1 DEF SEG=0: IF PEEK(&H1F2)<> 80 OR PEEK(&H1F3)<> 7 THEN NEW
10 COMMON GAME%: GOTO 10000
20 IF NOT PCJR THEN DEF SEG=0: POKE &H417,PEEK(&H417) OR &H20: DEF SEG
30 KB%=-1: RRND=RND: KB$=INKEY$: GOSUB 80: IF KB$="" THEN RETURN ELSE KB%=ASC(KB$)
40 KB$=INKEY$: IF KB$<>"" THEN GOSUB 80: GOTO 40 ELSE RETURN
50 KB.SPACE=FRE(" "): GOSUB 40
60 KB.I%=INT(KB.SEC*18.2)
70 RRND=RND: DEF SEG=0: KB.II%=PEEK(&H46C): WHILE KB.II%=PEEK(&H46C): WEND: GOSUB 20: IF KB%<>-1 THEN RETURN ELSE KB.I%=KB.I%-1: IF KB.I%>0 THEN 70 ELSE RETURN
80 IF KB$="" THEN RETURN ELSE IF ASC(KB$)<>19 OR PCJR THEN RETURN
90 KB$="": SND.MODE=(SND.MODE+1) MOD 2: DEF SEG=0: POKE &H40F,((PEEK(&H40F) AND &HFC) OR ((SND.MODE+1) AND 3)): DEF SEG: RETURN
110 CC.Y%=C.Y%-8*(C.N%-1): GET (C.X%,CC.Y%)-STEP(23,C.N%*8-1),CAKE.V%: PUT (C.X%,CC.Y%),CAKE.V%,XOR: PUT (C.X%+C.DX%,CC.Y%+C.DY%),CAKE.V%,XOR: RETURN
120 DSP.L%=LEN(DSP.CS$): IF DSP.L%<=0 THEN RETURN ELSE FOR DSP.CI%=1 TO DSP.L%: DSP.C$=MID$(DSP.CS$,DSP.CI%,1): GOSUB 130: DSP.X%=DSP.X%+16: NEXT DSP.CI%: RETURN
130 LINE (DSP.X%,DSP.Y%)-STEP(15,15),0,BF: DSP.I%=INSTR(DSP.FCS$,DSP.C$): IF DSP.I%<=0 THEN LOCATE (DSP.Y%+7)\8+1,(DSP.X%+7)\8+1: PRINT DSP.C$;: RETURN
150 DSP.VI#(4)=DSP.V#(DSP.T%+4): DSP.VI#(5)=DSP.V#(DSP.T%+5): DSP.VI#(6)=DSP.V#(DSP.T%+6): DSP.VI#(7)=DSP.V#(DSP.T%+7): DSP.VI#(8)=DSP.V#(DSP.T%+8): PUT (DSP.X%,DSP.Y%),DSP.VI#: RETURN
8000 IF SND.MODE=0 THEN RETURN ELSE SOUND 400,0.2: RETURN
8010 IF SND.MODE=0 THEN RETURN ELSE SOUND 400+24*I,0.3: RETURN
8020 IF SND.MODE=0 THEN RETURN ELSE SOUND 200+C.I%*50,0.2: RETURN: IF SND.MODE=0 THEN RETURN ELSE SOUND 200+C.I%*50,0.2: RETURN
8030 IF SND.MODE=0 THEN RETURN ELSE SOUND 4000-C.I%*200-C.II%*50,0.05: RETURN
8040 IF SND.MODE=0 THEN RETURN ELSE SOUND 4000-C.I%*200-ROP%*50,0.2: RETURN
8050 IF SND.MODE=0 THEN RETURN ELSE SOUND 2000,0.2: RETURN
8060 IF SND.MODE=0 THEN RETURN ELSE SOUND 1000,0.2: RETURN
8070 IF SND.MODE=0 THEN RETURN ELSE SOUND 3200-C.I%*100-C.II%*100,0.2: RETURN
8080 IF SND.MODE=0 THEN RETURN ELSE SOUND DSP.F%,0.1: RETURN
8090 IF SND.MODE=0 THEN RETURN ELSE SOUND 1000,0.4: RETURN
8100 IF SND.MODE=0 THEN RETURN ELSE SOUND 200+C.I%*50,0.2: RETURN
8110 IF SND.MODE=0 THEN RETURN ELSE SOUND 200+C.I%*50,0.2: RETURN
8120 IF SND.MODE=0 THEN RETURN ELSE PLAY "T120L16MSO2CP64DP64EP64F.": RETURN
8130 IF SND.MODE=0 THEN RETURN ELSE PLAY "T120L16MSO2CP64DP64EP64F.P16CP64F2.": RETURN
9000 IF SND.MODE=0 THEN RETURN ELSE FOR I=1 TO 2: FOR J=0 TO 6: SOUND 2000-J*100,0.2: SOUND 32767,0.4: NEXT J: SOUND 1200,0.2: SOUND 32767,0.4: FOR J=0 TO 6: SOUND 1200+J*100,0.2: SOUND 32767,0.4: NEXT J: SOUND 2000,0.2: SOUND 32767,0.4: NEXT I: RETURN
9010 IF SND.MODE=0 THEN RETURN ELSE SOUND 200,12: RETURN
9020 IF SND.MODE=0 THEN RETURN ELSE FOR SND.I%=1 TO 3: SOUND 600+RND*600,0.5: SOUND 32767,0.5: NEXT SND.I%: SOUND 1200+RND*600,0.5: RETURN
9030 IF SND.MODE=0 THEN RETURN ELSE SOUND 1000,0.5: SOUND 32767,3: SOUND 3000,0.5: SOUND 32767,3: RETURN
9040 IF SND.MODE>0 THEN SOUND 2500,0.5: RETURN ELSE RETURN
9050 IF SND.MODE=0 THEN RETURN ELSE SOUND 1000+I*20,0.2: SOUND 32767,0.4: RETURN
9060 IF SND.MODE=0 THEN RETURN ELSE SOUND 3000-C.I%*8,0.2: RETURN
9070 IF SND.MODE=0 THEN RETURN ELSE SOUND 1000+24*(CC.I%+CNT.FREQ%),0.4: RETURN
10000 DEF SEG=&HF000: PCJR=PEEK(&HFFFE)=&HFD: SND.MODE=1: DEF SEG=0: I=PEEK(&H40F) AND 3: IF I>0 THEN SND.MODE=I-1: IF SND.MODE=2 THEN SOUND ON ELSE IF PCJR THEN SOUND OFF
10010 ON ERROR GOTO 62000: GOSUB 62120: GOSUB 11020: GOSUB 10340: KEY OFF: OP%=4: OP$="/": GAME%=3: DEF SEG=0: IF (PEEK(&H417)AND &HF0)<>&HF0 THEN GAME%=2: OP%=3: OP$="x"
10140 GOSUB 10360: TRY%=TRY%+1: IF OK% THEN CORRECT%=CORRECT%+1: CORRECT.IN.ROW%=CORRECT.IN.ROW%+1: IF CORRECT.IN.ROW%<5 THEN 10190 ELSE CORRECT.IN.ROW%=0: IF LVL<3 THEN GOSUB 10620: GOTO 10190 ELSE 10190
10240 CLS: LOCATE ,,0: KB.SEC=0.3: GOSUB 60: SCREEN 0,1: LOCATE 1,1,0: KB.SEC=0.3: GOSUB 60: IF RANK%<1 OR RANK%>10 THEN RANK%=1
10250 COLOR 14,0: LOCATE 2,13,0: PRINT "YOUR RANK SO FAR";: COLOR 11: LOCATE 3,3: PRINT STRING$(36,205)
10260 FOR I=1 TO 10: IF I=RANK% THEN COLOR 5 ELSE COLOR 2
10270 LOCATE 25-I*2,13,0: PRINT LEVEL$(I);: NEXT I
10280 FOR I=1 TO 4: GOSUB 8000: COLOR 15: LOCATE 25-RANK%*2,13,0: PRINT LEVEL$(RANK%);: KB.SEC=0.5: GOSUB 60: GOSUB 8000
10290 COLOR 4: LOCATE 25-RANK%*2,13,0: PRINT LEVEL$(RANK%): KB.SEC=0.5: GOSUB 60: NEXT I
10300 IF RANK%<10 THEN CLS: KB.SEC=0.3: GOSUB 60: SCREEN 1,0: COLOR 0,-(OP%=3): LOCATE 1,1,0: KB.SEC=0.3: GOSUB 60: RETURN
10310 LOCATE 25-RANK%*2,13,0: COLOR 2: PRINT LEVEL$(RANK%)
10320 FOR I = 1 TO 10: GOSUB 8010: COLOR 4: LOCATE 25-I*2,13,0: PRINT LEVEL$(I): KB.SEC=0.4: GOSUB 60: NEXT I
10330 RANK%=1: GOTO 10480
10340 RESTORE 10350: DIM LEVEL$(10): FOR I=1 TO 10: READ LEVEL$(I): NEXT I: RETURN
10350 DATA "BEGINNER","NOVICE","CLEANUP CREW","CUTTER'S HELPER", "APPRENTICE","CAKER SECOND CLASS","CUTTER", "CAKER FIRST CLASS","EXPERT","MASTER CAKER"
10490 KB.SEC=1500: GOSUB 60: IF KB%=-1 THEN 11050 ELSE A$=CHR$(KB%): IF A$="Y" OR A$="y" THEN RETURN 10040 ELSE IF A$="N" OR A$="n" THEN 11050 ELSE 10490
10500 IF OP%=4 THEN 10560
10510 IF DSP.ANS.ONLY% THEN 10530 ELSE DSP.X%=32: DSP.Y%=16: DSP.C%=1: DSP.CS$=RIGHT$(SPACE$(2)+STR$(LOP%),2): GOSUB 120
10520 DSP.X%=16: DSP.Y%=32: DSP.CS$=RIGHT$(OP$+RIGHT$(SPACE$(2)+STR$(ROP%),2),3): GOSUB 120: LINE (32,55)-STEP(31,2),1,BF
10530 DSP.ANS.ONLY%=0: DSP.QX%=32: DSP.QY%=64: DSP.X%=32: DSP.Y%=64: DSP.CS$=" ?": IF ANS%>=0 THEN DSP.CS$=RIGHT$(" "+STR$(ANS%),2)
10540 IF ANS%=100 THEN DSP.CS$="100": DSP.X%=16
10550 GOSUB 120: RETURN
10560 IF DSP.ANS.ONLY% THEN 10580 ELSE DSP.CS$=RIGHT$(" "+STR$(LOP%)+ RIGHT$(" "+STR$(PROD%),4),6): DSP.X%=16: DSP.Y%=128: DSP.QX%=80: DSP.QY%=96: DSP.C%=1: GOSUB 120
10570 LINE (63,119)-STEP(48,2),1,BF: LINE (63,119)-STEP(2,24),1,BF
10580 DSP.ANS.ONLY%=0: DSP.X%=80: DSP.Y%=96: DSP.CS$=" ?": IF ANS%>=0 THEN DSP.CS$=RIGHT$(" "+STR$(ANS%),2)
10590 GOSUB 120: RETURN
10600 MAX.R%=5-2*(LVL=2)-5*(LVL>=3): LOP%=FNRN%(2,MAX.R%): ROP%=FNRN%(2,MAX.R%): PROD%=LOP%*ROP%: IF PROD%>100 THEN 10600 ELSE IF LOP%=LOP.LST% OR ROP%=ROP.LST% OR PROD%=PROD.LST% THEN 10600
10810 IF ANSV.D%<=0 THEN ANSV.D%=300: DIM ANSV%(ANSV.D%)
10820 GET (32,32)-(63,47),ANSV%: FOR DSP.X%=33 TO 80: PUT (DSP.X%-1,32),ANSV%: GOSUB 8050: PUT (DSP.X%,32),ANSV%: NEXT DSP.X%
10830 FOR DSP.Y%=33 TO 96: LINE (80,DSP.Y%+15)-STEP(31,0),0: PUT (80,DSP.Y%-1),ANSV%: GOSUB 8060: PUT (80,DSP.Y%),ANSV%: NEXT DSP.Y%: KB.SEC=1: GOSUB 60: RETURN
10840 FOR C.I%=1 TO LOP%: DSP.X%=32: DSP.Y%=16: DSP.CS$=RIGHT$(" "+STR$(C.I%),2): GOSUB 120
10850 FOR C.II%=1 TO ROP%: DSP.CS$=RIGHT$(" "+STR$(ROP%*(C.I%-1)+C.II%),3): DSP.X%=16: DSP.Y%=64: DSP.C%=2
10860 FOR C.III%=1 TO LEN(DSP.CS$): DSP.C$=MID$(DSP.CS$,C.III%,1): IF DSP.C$<>MID$(DSP.CSL$,C.III%,1) THEN GOSUB 130
10870 DSP.X%=DSP.X%+16: NEXT C.III%: DSP.CSL$=DSP.CS$
10880 LOCATE (C.I%-1)*2+CL.Y%\8+1,(C.II%*2+17),0: PRINT MID$(STR$(C.II%),2,LEN(STR$(C.II%))-1);: GOSUB 8070: KB.SEC=0.1: GOSUB 60: NEXT C.II%: NEXT C.I%: RETURN
10890 DSP.L%=DSP.Y%\8+1: DSP.P%=DSP.X%\8+1: FOR DSP.I%=1 TO LEN(DSP.CS$): GOSUB 8080: DSP.C$=MID$(DSP.CS$,DSP.I%,1): LOCATE DSP.L%,DSP.P%: PRINT DSP.C$;: LOCATE DSP.L%,DSP.P%+DSP.I%-1: PRINT DSP.C$;
10900 NEXT DSP.I%: LOCATE DSP.L%,DSP.P%: PRINT DSP.CS$;: RETURN
10910 DSP.L%=DSP.Y%\8+1: DSP.P%=DSP.X%\8+1: DSP.PL%=DSP.P%+LEN(DSP.CS$)-1: FOR DSP.I%=LEN(DSP.CS$) TO 1 STEP -1: GOSUB 8080