
100 ! ***** CLIFF CLIMBER **** M. Ward 1987 / rev. J. Brown/L. Dorais Feb. 1993 / Ottawa UG
110 DIM SC(2),L(2),M(2),SCR$(23),DIFF$(3):: CALL COLOR(13,2,15)
120 GOTO 150 :: A$,AL,C,CDIF,DIFF,DIFL,G,HS,J,K,NP,P,Q,R,RC,RM,RR,S,X,Y,Z :: CALL CLEAR :: CALL SCREEN :: CALL KEY :: CALL JOYST
130 CALL CHAR :: CALL HCHAR :: CALL GCHAR :: CALL COLOR :: CALL SPRITE
140 CALL LOCATE :: CALL POSITION :: CALL COINC :: CALL PATTERN :: CALL MOTION :: CALL DELSPRITE :: CALL SOUND :: !@P-
150 DIFF$(0)="EASY" :: DIFF$(1)="INTERMEDIATE" :: DIFF$(2)="PROFESSIONAL" :: DIFF$(3)="IMPOSSIBLE!"
160 CALL CHAR(128,"0008142242420100",129,"",140,"FFFFFFFFFFFF8080",141,"8080808080808080",142,"F0F0FEFEFEFE8E8E")!mountain, winner flag
170 CALL CHAR(64,"005A5A3C18182442",130,"0058583C1A7A4402",131,"001A1A3C585E2240",132,"003C7E7E7E7E3C")! man, rock
180 CALL CLEAR :: CALL SCREEN(15):: DISPLAY AT(1,7):"CLIFF CLIMBER" :: IF AL THEN 200 ELSE AL=1
190 DISPLAY AT(5,1):"Use Joystick #1": :"JUMP ROW with FIRE button": :"RELEASE ALPHA-LOCK..." :: ACCEPT AT(9,24):A$
200 DISPLAY AT(5,1):"HIGH SCORE:";HS: :"LAST SCORE PLAYER 1:";SC(1): :"LAST SCORE PLAYER 2:";SC(2)
210 DISPLAY AT(15,1):"Press <SPACE> to change":"DIFFICULTY level": : :"Press <1> or <2> for number":"      of PLAYERS": :"Press <Q> to QUIT"
220 DISPLAY AT(13,1):"DIFFICULTY: "&DIFF$(DIFL):: CDIF=DIFF
230 CALL KEY(0,K,S):: IF S=0 THEN 230 :: IF K=81 OR K=113 THEN END
240 IF K<>32 THEN 250 ELSE DIFL=DIFL+1 :: IF DIFL>3 THEN DIFL=0 :: GOTO 220 ELSE 220
250 IF K<49 OR K>50 THEN 230 ELSE DIFF=20+DIFL*20 :: IF DIFF=CDIF THEN 300
260 DISPLAY AT(24,1)ERASE ALL:DIFF$(DIFL)&" mountain data" :: RANDOMIZE
270 FOR R=1 TO 23 :: SCR$(R)="" :: FOR C=1 TO 28 :: G=129+(INT(RND*100)>DIFF)
280 SCR$(R)=SCR$(R)&CHR$(G):: NEXT C :: DISPLAY AT(24-R,1):SCR$(R):: NEXT R
290 ! ===== start =====
300 L(1),L(2)=1 :: NP=K-48 :: SC(1),SC(2)=0 :: M(1),M(2)=5 :: Q=-1
310 FOR P=1 TO NP :: IF M(P)=0 THEN 600
320 CALL CLEAR :: CALL SCREEN(3):: CALL HCHAR(1,3,64,M(P)-1)
330 DISPLAY AT(1,9):"LEVEL";L(P):: IF NP=2 THEN DISPLAY AT(1,21):"PLAYER";P
340 FOR X=220 TO 880 STEP 110 :: CALL SOUND(50,X,0):: NEXT X :: FOR X=880 TO 220 STEP -110 :: CALL SOUND(-100,X,0):: NEXT X
350 RANDOMIZE :: FOR R=24 TO 2 STEP -1 :: C=INT(RND*23)+1 :: DISPLAY AT(R,1):SCR$(C):: NEXT R ! mountain
360 C=INT(RND*27)+3 :: CALL GCHAR(24,C,G):: IF G=129 THEN 350 ELSE CALL SPRITE(#1,130,2,185,C*8-7):: R=24 ! man at bottom
370 RC=INT(RND*216)+17 :: RM=INT(RND*10)+5*L(P):: CALL SPRITE(#2,132,2,9,RC,RM,0)! rock
380 ! ===== climb =====
390 CALL JOYST(1,X,Y):: IF X=0 AND Y=0 THEN 480
400 J=1 :: CALL KEY(1,K,S):: IF K=18 THEN J=2 ! jump one row with fire
410 CALL COINC(ALL,Z):: IF Z THEN 550
420 R=R-SGN(Y)*J :: IF R>=25 THEN R=24
430 SC(P)=SC(P)+Y :: IF R<=1 THEN 520
440 C=C+SGN(X)*J :: IF C>2 OR C<31 THEN 460 ELSE C=C-SGN(X)*J
450 CALL COINC(ALL,Z):: IF Z THEN 550
460 CALL GCHAR(R,C,G):: CALL SOUND(-10,-6,0):: CALL PATTERN(#1,130+(Q=-1)*-1):: Q=-Q
470 CALL LOCATE(#1,R*8-7,C*8-7):: IF G<>128 THEN 550 ! climb
480 CALL COINC(ALL,Z):: IF Z THEN 550 ELSE CALL POSITION(#2,RR,RC):: IF RR<193 THEN 500 ELSE CALL DELSPRITE(#2)! check rock row
490 RC=INT(RND*216)+17 :: RM=INT(RND*10)+5*L(P):: CALL SPRITE(#2,132,2,9,RC,RM,0)! change rock column/speed
500 CALL COINC(ALL,Z):: IF Z THEN 550 ELSE 390
510 ! ===== wins level =====
520 CALL DELSPRITE(ALL)
530 FOR X=330 TO 770 STEP 110 :: CALL SOUND(-500,X,0):: NEXT X :: L(P)=L(P)+1 :: IF L(P)>15 THEN 620 ELSE 320
540 ! ===== man falls (hit by rock or reaches hole) =====
550 CALL MOTION(#1,20,0)
560 CALL POSITION(#1,R,C):: IF R<193 THEN CALL SOUND(-100,320-R,0):: GOTO 560 ELSE CALL DELSPRITE(ALL)! man falls
570 M(P)=M(P)-1 :: IF M(P)<>0 THEN 600 :: CALL HCHAR(8,10,32,12):: CALL HCHAR(9,10,32,12):: CALL HCHAR(10,10,32,12)
580 DISPLAY AT(9,9)SIZE(-10):"GAME OVER!" :: IF NP=2 THEN DISPLAY AT(12,9)SIZE(-10):"  PLAYER "&STR$(P)&"  "
590 FOR X=1 TO 20 :: CALL SOUND(-100,RND*200+110,0):: NEXT X :: IF HS>SC(P)THEN 600 ELSE HS=SC(P)
600 NEXT P :: IF M(1)=0 AND M(2)=0 THEN 180 ELSE IF M(1)=0 AND NP=1 THEN 180 ELSE 310
610 ! ===== total win =====
620 FOR R=1 TO 6 :: DISPLAY AT(R,1):RPT$(CHR$(128),R):: NEXT R :: DISPLAY AT(3,8):"CONGRATULATIONS!"
630 CALL HCHAR(6,10,64):: CALL HCHAR(5,11,140):: CALL HCAR(6,11,141)
640 IF NP=1 THEN A$="   YOU WIN!" ELSE A$="PLAYER "&STR$(P)&" WINS"
650 Q=-1 :: DISPLAY AT(5,11)SIZE(-13):A$ :: DISPLAY AT(24,1):" Press FIRE or ANY KEY..."
660 Q=-Q :: CALL SOUND(-100,RND*800+110,0):: CALL HCHAR(5,11,140+Q=-1)*-2)
670 CALL KEY(0,K,S):: CALL KEY(1,X,Y):: IF S=0 AND Y=0 THEN 660
680 IF HS>SC(1)THEN 690 ELSE HS=SC(1)
690 IF HS>SC(2)THEN 180 ELSE HS=SC(2):: GOTO 180
