! ****************** ! * * ! * COSMIC DEFENSE * ! * * ! * J.R. MORRIS * ! * * ! ****************** ! NOTE; MUST USE XB256 AND COMPILER ! ********************* ! * SCREEN INITIALIZE * ! ********************* 100 CALL LINK("SCRN2") ! SCREEN 2 110 CALL LINK("SCREEN",2) ! COLOUR THE SCREEN BLACK 120 CALL CLEAR ! CLEAR THE SCREEN 125 CALL MAGNIFY(3) ! SPRITE MAGNIFICATION FACTOR 3 ! ****************** ! * TOP SCORE ZERO * ! ****************** 130 TOP=0 ! CAN BE CHANGED TO ANY NUMBER. ! ***************** ! * GRAPHICS DEFS * ! ***************** 140 FOR A=1 TO 14 ! START THE LOOP TO READ DATA 150 READ Z,Z$ ! READ THE DATA IN NUMBERAL AND STRING 160 CALL CHAR(Z,Z$) ! ASSIGN THE NUMERAL TO THE STRING 170 NEXT A ! END THE LOOP. NOT FINISHED? GO BACK TO 140 AND READ MORE ! ----------------------------- ! DATA FOR GRAPHICS DEFINITIONS ! ----------------------------- 180 DATA 64,00002030393D3F3F1F0F060200000000000008183878F8F8F0E0C08000000000,68,00000000017D7F7F7F3F06020000000000000000007CFCFCFCF8C08000000000 190 DATA 72,0000000003070F1F3F3F3C38302000000000000080C0E0F0F8F8783818080000,76,00000000017D7F7F7F3F06020000000000000000007CFCFCFCF8C08000000000 200 DATA 80,08040F1B3F2F280600000000000000002040E0B0F8E828C00000000000000000,84,08242F3B3F1F081000000000000000002048E8B8F8F020100000000000000000 210 DATA 88,0000010101030100000000000000000000000000008000000000000000000000,92,241208600812240000000000000000004890200C209048000000000000000000 220 DATA 96,000103033F7F7F7F000000000000000000008080F8FCFCFC0000000000000000,100,0101010101000000000000000000000000000000000000000000000000000000 230 DATA 104,031F7FEAFF7F3810000000000000000080F0FCAEFEFC38100000000000000000,108,0001000100010001000000000000000000008000800080008000000000000000 240 DATA 112,00045652793D167F0000000000000000000080A4ACF8B8FE0000000000000000,116,00000125351F1D7F000000000000000000206A4A9EBC68FE0000000000000000 245 CALL LINK("CHAR2",40,"7E81B9B5AD9D817E") ! ---------------- ! GRAPHICS DEFINED ! ---------------- ! 40 = WALL FOR MOTHERSHIP ! 64 = RED GUARDIAN FRAME #1 ! 68 = RED GUARDIAN FRAME #2 ! 72 = RED GUARDIAN FRAME #3 ! 76 = RED GUARDIAN FRAME #4 ! 80 = ALIEN FRAME #1 ! 84 = ALIEN FRAME #2 ! 88 = ALIEN MISSILE ! 92 = ALIEN / GUARDIAN / MOTHERSHIP EXPLOSION ! 96 = PLAYER BASE ! 100 = PLAYER MISSILE ! 104 = MOTHERSHIP ! 108 = MOTHERSHIP MISSILE ! 112 = PLAYER EXPLOSION FRAME #1 ! 116 = PLAYER EXPLOSION FRAME #2 ! ****************************************************** ! * CREATE AN ARRAY FOR SPRITE POSITIONS ON THE SCREEN * ! ****************************************************** 250 DIM SPX(24),SPY(32) ! 24 ROWS BY 32 COLUMNS 260 N=0 ! DECLARE 'N' AS NILL 270 FOR A=1 TO 24 ! START THE LOOP TO PLACE ROW POSITIONS 280 N=N+8 ! INCREMENT 'N' BY 8 290 SPX(A)=N ! ASSIGN IT TO SPX(X) ARRAY 300 NEXT A ! ARE WE DONE? IF SO MOVE ON, IF NOT BACK TO START OF LOOP 310 SPX(1)=1 ! ODD ONE OUT MUST BE 1 (CAN'T BE ZERO) 320 N=0 ! DECLARE 'N' AS NILL 330 FOR A=1 TO 32 ! START THE LOOP TO PLACE COLUMN POSITIONS 340 N=N+8 ! INCREMENT 'N' BY 8 350 SPY(A)=N ! ASSIGN IT TO SPY(X) ARRAY 360 NEXT A ! ARE WE DONE? IF SO MOVE ON, IF NOT BACK TO START OF LOOP 370 SPY(1)=1 ! ODD ONE OUT MUST BE 1 (CAN'T BE ZERO) ! ************************************** ! * DEFINE MOTHERSHIP MOVEMENT PATTERN * ! ************************************** 380 DIM MO(64) ! NUMBER OF MOVEMENTS IN AN ARRAY 390 N=1 ! MOTHERSHIP STARTS HERE 400 FOR A=1 TO 32 ! START THE LOOP TO PLACE MOTHERSHIP POSITIONS GOING RIGHT 410 MO(A)=N ! ASSIGN 'N' TO THE MOTHERSHIP ARRAY 420 N=N+1 ! INCREMENT 'N' BY 1 430 NEXT A ! ARE WE DONE? IF SO MOVE ON, IF NOT GO BACK TO LOOP START 440 N=32 ! MOTHERSHIP GOING RIGHT STARTS HERE 450 FOR A=33 TO 64 ! START THE LOOP TO PLACE MOTHERSHIP POSITIONS GOING LEFT 460 MO(A)=N ! ASSIGN 'N' TO THE MOTHERSHIP ARRAY 470 N=N-1 ! DECREMENT 'N' BY 1 480 NEXT A ! ARE WE DONE? IF SO MOVE ON, IF NOT BACK TO START OF LOOP ! ************************* ! * ALIEN'S "ALIVE" ARRAY * ! ************************* 490 DIM AL(12) ! ALL ALIENS "ALIVE" ARRAY ! ************************* ! * ALIEN'S XY COORDINATES * ! ************************* 500 DIM AY(9) ! STORE THEM ALL IN AN ARRAY 510 AY(1)=1::AY(2)=3::AY(3)=6 520 AY(4)=1::AY(5)=3::AY(6)=6 530 AY(7)=1::AY(8)=3::AY(9)=6 540 AX(1)=10::AX(2)=10::AX(3)=10 550 AX(4)=12::AX(5)=12::AX(6)=12 560 AX(7)=14::AX(8)=14::AX(9)=14 ! ******************************* ! * VARIABLES DECLARED FOR GAME * ! ******************************* 800 T1=0 ! TIMER FOR MOTHERSHIP MOVEMENTS 805 T2=0 ! TIMER FOR GUARDIAN PATTERNS 810 MOTHER=0 ! MOTHERSHIP'S POSITION STORED IN "MOTHER" 820 GUARD=64 ! GUARDIAN PATTERN 825 PY=16 ! PLAYER'S Y POSITION 830 FOR A=1 TO 12::AL(A)=1::NEXT A ! ALL ALIENS ARE "ALIVE" 840 DEAD=0 ! DEAD IS NILL 845 COUNT=0 ! COUNTER FOR ALIENS TO MOVE 850 PF=0 ! PLAYER NOT FIRING ! TEST CODE 1000 GOSUB 20100 ! GET GAME DISPLAY 1010 GOSUB 20200 ! INCREMENT MOTHERSHIP MOVEMENT COUNTER 1015 GOSUB 20300 ! INCREMENT GUARDIAN PATTERNS 1020 GOSUB 20400 ! INCREMENT AN ALIEN'S POSITION 1025 GOSUB 20500 ! READ THE JOYSTICK 1030 GOSUB 20600 ! INCREMENT PLAYER MISSILE IF PRESENT 1035 GOTO 1010 ! BACK TO MOTHERSHIP INCREMENTATION ! **************** ! * GAME DISPLAY * ! **************** 20100 CALL CLEAR :: CALL DELSPRITE(ALL) ! CLEAR SCREEN & GET RID OF ANY SPRITES 20110 FOR A=4 TO 8 ! START A LOOP TO DETERMINE SOLID BLOCKS 20120 CALL LINK("DISPLY",A,1,"((((((((((((((((((((((((((((((((") ! DISPLAY THE BLOCKS USING 'A' FOR ROWS 20130 NEXT A ! END THE LOOP IF FINISHED 20140 CALL SPRITE(#2,64,7,1,1,#3,64,7,1,240) ! PLACE THE TWO RED GUARDIANS 20150 CALL SPRITE(#4,96,4,SPX(23),SPY(PY)) ! PLACE THE PLAYER BASE 20160 CALL SPRITE(#5,80,5,SPX(10),SPY(1)) ! PLACE ALIEN #1 20161 CALL SPRITE(#6,80,5,SPX(10),SPY(3)) ! PLACE ALIEN #2 20162 CALL SPRITE(#7,80,5,SPX(10),SPY(6)) ! PLACE ALIEN #3 20163 CALL SPRITE(#8,80,13,SPX(12),SPY(1)) ! PLACE ALIEN #4 20164 CALL SPRITE(#9,80,13,SPX(12),SPY(3)) ! PLACE ALIEN #5 20165 CALL SPRITE(#10,80,13,SPX(12),SPY(6)) ! PLACE ALIEN #6 20166 CALL SPRITE(#11,80,12,SPX(14),SPY(1)) ! PLACE ALIEN #7 20167 CALL SPRITE(#12,80,12,SPX(14),SPY(3)) ! PLACE ALIEN #8 20168 CALL SPRITE(#13,80,12,SPX(14),SPY(6)) ! PLACE ALIEN #9 20170 RETURN ! TERMINATE THE SUB IF FINISHED ! ************************ ! * INCREMENT MOTHERSHIP * ! ************************ 20200 T1=T1+1 ! INCREMENT THE MOTHERSHIP TIMER BY 1 20205 IF T1>4 THEN 20210 ELSE 20299 ! IF TIMER REACHES 4, CONTINUE OTHERWISE TERMINATE AT RETURN 20210 T1=0 ! RESET THE MOTHERSHIP TIMER 20215 MOTHER=MOTHER+1 ! INCREMENT "MOTHER" BY 1..... 20220 IF MOTHER>64 THEN MOTHER=1 ! ....UNTIL IT REACHES 64 THEN MAKE IT 1 AGAIN 20222 Q=MO(MOTHER) ! MOTHERSHIP POSITION STORED IN Q 20225 CALL SPRITE(#1,104,16,SPX(2),SPY(Q)) ! DISPLAY THE MOTHERSHIP'S NEW POSITION 20299 RETURN ! TERMINATE SUBROUTINE ! ******************************** ! * INCREMENT GUARDIAN ANIMATION * ! ******************************** 20300 T2=T2+1 ! INCREMENT THE TIMER FOR THE GUARD PATTERNS 20305 IF T2>16 THEN 20310 ELSE 20330 ! IF TIMER REACHES 16 THEN CHANGE PATTERNS 20310 T2=0 ! TIMER BACK TO ZERO 20315 GUARD=GUARD+4 ! INCREMENT PATTERN TO THE NEXT ONE 20316 IF GUARD>76 THEN GUARD=64 ! UNTIL IT REACHES 76 THEN BACK TO 64 20320 CALL PATTERN(#2,GUARD,#3,GUARD) ! ASSIGN PATTERN TO GUARDS 20330 RETURN ! TERMINATE SUBROUTINE ! ********************** ! * INCREMENT AN ALIEN * ! ********************** 20400 COUNT=COUNT+1 ! INCREMENT "COUNT" BY 1 20405 IF COUNT>9 THEN COUNT=1 ! IF IT'S PAST 9, GO BACK TO 1 20410 IF AL(COUNT)=0 THEN 20499 ! IF ALIEN IS DEAD, TERMINATE THE PROGRAM 20420 AY(COUNT)=AY(COUNT)+1 ! INCREMENT ALIEN USING "COUNT" 20430 IF AY(COUNT)>32 THEN AY(COUNT)=1 ! GO BACK TO 1 IF GREATER THAN 32 20440 CALL LOCATE(#COUNT+4,SPX(AX(COUNT)),SPY(AY(COUNT))) ! PLACE THE NEW POSITION ALIEN 20499 RETURN ! TERMINATE SUBROUTINE ! ********************* ! * READ THE JOYSTICK * ! ********************* 20500 CALL JOYST(1,JY,JX)::CALL KEY(1,K,ST) ! READ JOYSTICK INPUT 20501 IF JY=-4 THEN 20510 ! HAS PLAYER PULLED LEFT? 20502 IF JY=4 THEN 20520 ! HAS PLAYER PULLED RIGHT? 20503 IF K=18 THEN 20530 ! HAS PLAYER PRESSED FIRE? 20505 RETURN ! TERMINATE SUBROUTINE 20510 PY=PY-1 :: IF PY<1 THEN PY=1 ! DECREMENT PY 20511 CALL LOCATE(#4,SPX(23),SPY(PY)) ! PLACE PLAYER SPRITE AT PY 20512 CALL KEY(1,K,ST)::IF K=18 THEN 20530 ! HAS PLAYER PRESSED FIRE? 20513 GOTO 20505 ! TERMINATE SUBROUTINE 20520 PY=PY+1 :: IF PY>31 THEN PY=1 ! INCREMENT PY 20521 GOTO 20511 ! AS ABOVE 20530 IF PF=1 THEN 20505 ! TERMINATE IF PLAYER ALREADY FIRING 20531 PF=1::CALL SPRITE(#14,100,16,SPX(3),SPY(PY)) ! PLACE PLAYER MISSILE ABOVE PLAYER BASE 20532 PFX=23::PFY=PY ! COORDINATES FOR PLAYER MISSILE TO START 20533 GOTO 20505 ! TERMINATE SUBROUTINE ! *************************************** ! * INCREMENT PLAYER MISSILE IF PRESENT * ! *************************************** 20600 IF PF=1 THEN 20605 ELSE 20699 ! IF PLAYER NOT FIRING THEN TERMINATE 20605 CALL GCHAR(PFX,PFY,CH) ! CHECK WHAT'S THERE ! PUT ENEMY COLLISIONS HERE ! PUT WALL COLLISIONS HERE 20620 PFX=PFX-1 ! DECREMENT PFX VALUE 20625 IF PFX<2 THEN 20630 ELSE 20640 ! GET RID OF MISSILE IF AT TOP 20630 PF=0::CALL DELSPRITE(#14)::GOTO 20699 ! GET RID OF MISSILE AND BRANCH OFF TO RETURN 20640 CALL LOCATE(#14,SPX(PFX),SPY(PFY)) ! DISPLAY MISSILE 20699 RETURN ! TERMINATE SUBROUTINE