! VARIABLES IN USE; ! ! MH = MORGS HIT BY PLAYER ! SC = PLAYER'S SCORE ! TOP = PLAYER'S BEST SCORE ! MEN = PLAYER'S LIVES ! T1 = COUNTS UP TO 16 AND THEN GOES BACK TO 0, INCREMENTS T2 FOR SCREEN COLOUR CHANGE ! T2 = COUNTS UP TO 16 AND THEN GOES BACK TO 3, FOR THE SCREEN COLOUR ! SND = USED FOR PLAYER WARPING INTO THE SCREEN, INCREMENTS BY 4 EACH TIME UNTIL WARP FINISHED ! D = DETERMINES THE DIRECTION THE PLAYER IS FACING, 1 = UP, 2 = DOWN, 3 = LEFT, 4 = RIGHT ! PF = PLAYER FIRING OR NOT, 1 OR 0 ! FD = DETERMINES THE DIRECTION THE PLAYER WAS FACING WHEN FIRE PRESSED ! X(XX) = ARRAY FOR SPRITES X ! Y(XX) = ARRAY FOR SPRITES Y ! ************************************************ ! * CLEAR THE SCREEN, TOP SCORE DECLARED AS NILL * ! ************************************************ ! ARRAY FOR SPRITES FILLED WITH POSITIONS 10 CALL CLEAR :: TOP=0::DIM X(24),Y(32) 15 N=0::FOR L=1 TO 24::X(L)=N::N=N+8::NEXT L::X(1)=1 16 N=0::FOR L=1 TO 32::Y(L)=N::N=N+8::NEXT L::Y(1)=1 20 call moves("GV",512,1204,1024) ! *********************** ! * DEFINE THE GRAPHICS * ! *********************** ! NOTE; WITH RXB, WE CAN DEFINE UP TO 15 CHARACTERS IN ONE STATEMENT, SO WE'LL DEFINE SIX SPRITE CHARS HERE. ! SPRITES DEFINED; ! 40 = SCHOONER UP ! 41 = SCHOONER DOWN ! 42 = SCHOONER LEFT ! 43 = SCHOONER RIGHT ! 44 = SCHOONER MISSILE ! 45 = EXPLOSION SPRITE ! 46 = WARP SPRITE 100 CALL CHAR(40,"1818183C7E7E7E42427E7E7E3C181818000F1EFEFE1E0F0000F0787F7F78F0000000183C3C180000925400C62844820055AA55AA55AA55AA") ! CHARACTERS DEFINED; ! 96 = MORG ! 104 = WALL 110 CALL CHAR(96,"BA7CD6FEC67C2844",104,"FFFFFFFFFFFFFFFF") ! ******************* ! * COLOURS DEFINED * ! ******************* 200 CALL COLOR(2,6,1,3,2,1,4,2,1,5,2,1,6,2,1,7,2,1,8,2,1,9,13,1,10,5,1) ! **************** ! * TITLE SCREEN * ! **************** ! SCREEN FLASHES WHILST WAITING FOR FIRE KEY, USES T1 AND T2 VARIABLES TO COUNT UP AND TOGGLE 500 CALL CLEAR :: T1=0 :: T2=3 510 CALL DELSPRITE(ALL) 515 A$="MOST MORGS BLASTED "&STR$(TOP) 520 CALL HPUT(10,11,"MORG BLASTER",16,7,A$,22,12,"PRESS FIRE") 530 CALL KEY(1,K,S) 540 T1=T1+1 :: IF T1>16 THEN 545 ELSE 560 545 T1=0 :: T2=T2+1 :: IF T2>16 THEN T2=3 550 CALL SCREEN(T2) 560 IF K=18 THEN 570 ELSE 530 570 CALL SCREEN(4) :: CALL BEEP 580 MEN=3 590 SC=0 600 MH=0 ! *************************** ! * SUB TO THE GAME SCREEN * ! *************************** 1000 GOSUB 10000 ! *********************************** ! * WARP THE PLAYER INTO THE SCREEN * ! *********************************** ! NOTE: PLAYER POSITION NOW USES XX AND YY, ALTERED LINE 1030 1010 SND=110 :: CALL SPRITE(#10,46,16,152,1,0,16,#11,46,16,152,248,0,-16) 1020 SND=SND+4::CALL SOUND(-1000,SND,0,SND+1,0,SND+2,0)::CALL COLLIDE(#10,#11,4,A+B)::IF A+B THEN 1030 ELSE 1020 1030 D=1::XX=20::YY=16::CALL SPRITE(#1,39+D,6,X(XX),Y(YY))::CALL DELSPRITE(#10,#11) 1040 CALL SOUND(-1500,110,30,110,30,3000,30,-8,0)::FOR Q=1 TO 50::CALL COLOR(1,16,16,1,1,2)::NEXT Q::CALL COLOR(1,2,1) ! ********************************** ! * WARP THE MORGS INTO THE SCREEN * ! ********************************** 1050 CALL HPUT(4,4,"`")::MX=24::MY=24::GOSUB 10200 1060 CALL HPUT(4,29,"`")::MX=24::MY=224::GOSUB 10200 1070 CALL HPUT(19,4,"`")::MX=144::MY=24::GOSUB 10200 1080 CALL HPUT(19,29,"`")::MX=144::MY=224::GOSUB 10200 ! ************* ! * MAIN LOOP * ! ************* ! 2100 = JOYSTICK ! 2200 = CHECK PLAYER MISSILE 1100 GOSUB 2100::GOSUB 2200::GOTO 1100 ! ************ ! * JOYSTICK * ! ************ ! THIS IS AN AMENDED ROUTINE THAT USES CALL JOYST AND CHANGES THE PATTERN OF THE PLAYER, HIS DIRECTION VALUE, AS PLAYER MOVES 2100 CALL JOYST(1,JY,JX) :: CALL KEY(1,K,ST)::IF K=18 THEN 2130 2105 IF JY=-4 THEN CALL PATTERN(#1,42)::D=3::B=YY-1::CALL GCHAR(XX,B,Z)::IF Z=104 THEN 2150 ELSE YY=YY-1::GOSUB 2160::GOTO 2165 2110 IF JY=4 THEN CALL PATTERN(#1,43)::D=4::B=YY+1::CALL GCHAR(XX,B,Z)::IF Z=104 THEN 2150 ELSE YY=YY+1::GOSUB 2160::GOTO 2165 2115 IF JX=4 THEN CALL PATTERN(#1,40)::D=1::A=XX-1::CALL GCHAR(A,YY,Z)::IF Z=104 THEN 2150 ELSE XX=XX-1::GOSUB 2160::GOTO 2165 2120 IF JX=-4 THEN CALL PATTERN(#1,41)::D=2::A=XX+1::CALL GCHAR(A,YY,Z)::IF Z=104 THEN 2150 ELSE XX=XX+1::GOSUB 2160::GOTO 2165 2125 GOTO 2150 ! * PLAYER PRESSED FIRE 2130 IF PF=1 THEN 2105 ELSE PF=1::FD=D::ON FD GOTO 2131,2132,2133,2134 2131 FX=-12::GOTO 2140 2132 FX=12::GOTO 2140 2133 FY=-12::GOTO 2140 2134 FY=12::GOTO 2140 2140 CALL POSITION(#1,P1,P2)::CALL SPRITE(#2,44,2,P1,P2,FX,FY)::CALL SOUND(-150,110,30,110,30,1500,30,-8,8) 2150 RETURN ! * PLACE THE SCHOONER IN NEW POSITION AND CHECK FOR ANY MORGS 2160 CALL LOCATE(#1,X(XX),Y(YY))::CALL GCHAR(XX,YY,Z)::IF Z=96 THEN 10300 2165 RETURN ! ************************ ! * CHECK PLAYER MISSILE * ! ************************ 2200 IF PF=1 THEN 2205 ELSE 2299 2205 CALL POSITION(#2,R,C)::ON FD GOTO 2220,2220,2210,2210 2210 IF C<16 THEN 2250 ELSE IF C>224 THEN 2250 ELSE 2299 2220 IF R<16 THEN 2250 ELSE IF R>152 THEN 2250 ELSE 2299 2250 CALL DELSPRITE(#2) :: PF=0 2299 RETURN ! *************** ! * GAME SCREEN * ! *************** 10000 CALL CLEAR 10010 CALL DELSPRITE(ALL) 10020 A$="hh hh hh hh" :: B$="hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh" :: C$="hhhhhhhhhhhhhhhhhhhhhh" 10030 CALL HPUT(1,1,B$,22,1,B$)::CALL VPUT(1,1,C$,1,32,C$)::CALL HPUT(8,7,A$,9,7,A$,14,7,A$,15,7,A$) 10040 CALL HPUT(23,1,"SCORE",23,16,"MORGS HIT",23,27,RPT$("(",MEN))::GOSUB 10100::RETURN ! ******************************* ! * PRINT THE SCORE & MORGS HIT * ! ******************************* 10100 CALL HPUT(24,1,SC,24,19,MH) :: RETURN ! ****************************** ! * MORG SPAWN SPRITES & SOUND * ! ****************************** 10200 CALL SPRITE(#10,46,16,MX,MY,-6,-6,#11,46,16,MX,MY,-6,6,#12,46,16,MX,MY,6,-6,#13,46,16,MX,MY,6,6) 10210 FOR L=220 TO 110 STEP-16::CALL SOUND(-150,L,0)::NEXT L::CALL DELSPRITE(#10,#11,#12,#13)::RETURN ! ************************** ! * PLAYER LANDS ON A MORG * ! ************************** 10300 STOP ! FINISH THIS LATER