10 REM ******************** 20 REM ** GUNSMOKE 99's *** 98 REM ******************** 99 REM * INITIAL SETTINGS 100 CALL CLEAR::CALL LINK("SCRN1") 110 XV=0::YV=9::XDEL=5::XDEL1=5::VX1=20::VY1=20::X=145::Y=20::SW=0::D=1::C=12::FT=0 120 HMIN=10::YMAX=250::HMIN1=10::YMIN=6::KILL=0::LIVES=5::LVL=1::CNTSH=0::HIT=0::HIT1=0 130 SCORE=0:: HSCORE=0::CNLVL=1 140 E1FRQ=0::E1ACT=0:: REM contatori 150 INPUT "DELAY:":XDEL :: INPUT "XDEL1:":XDEL1:: INPUT "YVEL:":YV 155 INPUT "TIME:":TM1 158 REM ******************* 159 REM * INTRO 168 REM ******************* 169 REM * FREE 178 REM ******************* 179 REM * FREE 188 REM ******************* 189 REM * FREE 198 REM ******************* 199 REM * INITIAL SETTING 200 CALL LINK("SCRN2")::CALL MAGNIFY(3)::CALL LOAD(-1,TM1) 201 CALL XSPASH(XDEL,YV,TM1) 210 CALL XSWAP(D,S1,S2,S3,S4,S5,S6,S7)::CALL XSHOW(D,S1,S2,S3,S4,S5,S6,S7,X,Y,C) 298 REM ******************* 299 REM * MAIN LOOP 300 CALL LINK("SYNC") 301 CALL XGENR(ENPOS,ENFRQ,ENACT,BSPEED,LSPEED) 305 REM CALL XUPD 308 REM ******************* 309 REM * CHECK BULLET BORDERS 310 IF KILL=1 THEN CALL XLIMI(D,8,HMIN,YMAX,HMIN1,YMIN,KILL) 318 REM ****************** 319 REM * CHECK COLLISIONS 320 IF KILL=1 THEN CALL XCOINC(HIT,HIT1,TOLL,YPOS) 328 REM ****************** 329 REM * GUNSLINGER HIT 330 IF HIT=-1 THEN HIT=0::CALL XDEAD(YPOS,C,LIVES) 333 REM ****************** 334 REM ENEMY HIT 335 IF HIT1=-1 THEN HIT1=0::CALL XSCORE(LIVES,LVL,CNLVL,CNTSH,SCORE,HSCORE) 338 REM ******************* 339 REM * KEYBORD SCAN 340 CALL XSCAN(D,D1,K,S,FIRE,GUN,GUN1) 348 REM ******************* 349 REM * OTHER KEYS 350 IF K=88 THEN CALL XQUIT::GOTO 900 358 REM ******************* 359 REM * NO KEY PRESSED 360 IF S=0 THEN 300 368 REM ******************* 369 REM * GUN UP/DOWN/FIRE 370 IF GUN=GUN1 AND K<>75 AND K<>74 THEN 375 372 CALL XGUN(D,X,Y,C,GUN,GUN1,XDEL1,S7)::GOTO 300 375 IF GUN=1 THEN IF FIRE=1 THEN CALL XSHOT(D,X,Y,C,VX1,VY1,KILL)::GOTO 300 376 IF GUN=0 AND FIRE=1 THEN 300 378 REM ******************* 379 REM * TURN SPRITE LEFT/RIGHT 380 IF D=D1 THEN 410 385 IF GUN=0 THEN 390 386 GUN=0::CALL XGUN(D,X,Y,C,GUN,XDEL1,S7) 390 CALL XSWAP(D,S1,S2,S3,S4,S5,S6,S7)::CALL XSHOW(D,S1,S2,S3,S4,S5,S6,S7,X,Y,C) 400 GOTO 300 408 REM ******************* 409 REM * MOVE SPRITE 410 IF GUN=0 THEN 416 415 GUN=0::CALL XGUN(D,X,Y,C,GUN,XDEL1,S7) 416 CALL XMOVE(D,Y,YV)::CALL XSLIDE(D,XDEL)::CALL XSHOW(D,S1,S2,S3,S4,S5,S6,S7,X,Y,C) 420 GOTO 300 900 END 1000 SUB XINTRO(X,Y,XDEL,YV,RST,W1,C,CL,CL1) 1001 CALL CLEAR::CALL SCREEN(13)::DISPLAY AT(12,6):" G U N E M O K E 99" 1002 CALL LOAD(-1,CL1) 1010 X=140::Y=248::FT=0 1015 D=-1::YV=YV*D 1020 CALL XSWAP(D,S1,S2,S3,S4,S5,S6,S7,W1) 1030 CALL XSHOW(D,S1,S2,S3,S4,S5,S6,S7,X,Y,C) 1050 CALL XSLIDE(D,XDEL)::CALL XMOVE(D,Y,YV) 1070 IF YV<0 THEN IF Y>=48 THEN CALL LINK("SYNC")::GOTO 1030 1075 IF YV>0 THEN IF Y<=190 THEN CALL LINK("SYNC")::GOTO 1030 1085 IF YV>0 THEN 1015 1086 D=1:: YV=YV*-1 :: GOTO 1020 1090 SUBEND 1120 SUB XCHAR(D) 1121 CALL DELSPRITE(#1,#2,#3,#4,#5,#6,#7) 1122 IF D=1 THEN RESTORE 1151 ELSE RESTORE 1171 1130 FOR A=1 TO 13::READ P,S$::CALL CHAR(P,S$)::NEXT A 1150 REM CHARACTER DATA DIRECTION DX 1151 DATA 96,0000000000000000000003FFFFFFFCC0000000000000030C30F0F0C0C0000000 PISTOLA 1 1152 DATA 100,0000000000000000000303FFFFFFFCC0000000000C0C3030F0F0C0C0C0000000 PISTOLA 2 1153 DATA 104,000000000000000003030FFFFFFCF0C00000303030C0C0C0C0C0C00000000000 PISTOLA 3 1154 DATA 108,000000303C3C3C3C3C3C3F3F0F00000000000000000000000000F00000000000 PISTOLA 0 1155 DATA 112,000000000000000000003F00000000000000000000000000FCFCFCFCFCFCFC3C TESTA SX 1156 DATA 116,0000000000000000030303030303030300000000000000000000FC00C0000000 TESTA DX 1157 DATA 120,000000030F3F3FFFFFF3F3F3FF3F3F0F3C3CFFFFFFFFFFFFFFFFFFFFFFFFFFFF CORPO SX 1158 DATA 124,00000000000000000000000000000000000000C0C0C0C0C0C0C0C0C0C0C0C0C0 CORPO DX 1159 DATA 128,03030303030303030303030303030000FCF0C0C0C0C0C0C0C0C0C0C0F0F0FCFC GAMBA SX 1160 DATA 132,03030303030303030303030303030000C0C0C0C0C0C0C0C0C0C0C0C0F0F0FCFC GAMBA DX 1161 DATA 136,03030303030F0F0F3F3C3CFCF0F03C3CFCF0C0C0C0C000000000000000000000 GAMBA SX RUN 1162 DATA 140,0F0F030000000003030F0F0F03030000F0F0FCFCFCF0F0F0C0C00000C0C00000 GAMBA DX RUN 1163 DATA 36,0000000000000001010000000000000000000000000000808000000000000000 BULLET 1170 REM CHARACTER DATA DIRECTION SX 1171 DATA 96,000000000000C0300C0F0F030300000000000000000000000000C0FFFFFF3F03 PISTOLA 1 1172 DATA 100,0000000030300C0C0F0F030303000000000000000000000000C0C0FFFFFF3F03 PISTOLA 2 1173 DATA 104,00000C0C0C03030303030300000000000000000000000000C0C0F0FFFF3F0F03 PISTOLA 3 1174 DATA 108,000000000000000000000F00000000000000000C3C3C3C3C3C3CFCFCF0000000 PISTOLA 0 1175 DATA 112,00000000000000003F3F3F3F3F3F3F3C00000000000000000000FC0000000000 TESTA DX 1176 DATA 116,000000000000000000003F00030000000000000000000000C0C0C0C0C0C0C0C0 TESTA SX 1177 DATA 120,3C3CFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000C0F0FCFCFFFFCFCFCFFFFCFCF0 CORPO DX 1178 DATA 124,0000000303030303030303030303030300000000000000000000000000000000 CORPO SX 1179 DATA 128,3F0F030303030303030303030F0F3F3FC0C0C0C0C0C0C0C0C0C0C0C0C0C00000 GAMBA DX 1180 DATA 132,0303030303030303030303030F0F3F3FC0C0C0C0C0C0C0C0C0C0C0C0C0C00000 GAMBA SX 1181 DATA 136,3F0F0303030300000000000000000000C0C0C0C0C0F0F0F0FC3C3C3F0F0F3C3C GAMBA DX RUN 1182 DATA 140,0F0F3F3F3F0F0F0F0303000003030000F0F0C000000000C0C0F0F0F0C0C00000 GAMBA SX RUN 1183 DATA 36,0000000000000001010000000000000000000000000000808000000000000000 BULLET 1190 SUBEND 1220 SUB XCHAR1 1221 CALL DELSPRITE(ALL) 1230 FOR A=1 TO 12::READ P,S$::CALL CHAR(P,S$)::NEXT A 1250 REM CHARACTER DATA FOR DEAD GUNSLINGER 1251 DATA 96,00000000000003030000303F0F3FFF3F00000000000000C0C0C0C3C3C3C3C3C0 1252 DATA 100,000000000000000000CCFFFCFCFFFFFF00000000000000000000000000CCF0FF 1253 DATA 104,0000000000000000000000000000000000000000000000000000000000000003 1254 DATA 108,000000000000000000000003030FFFFF00000000000000000000C00000FCC0FC 1255 DATA 112,030F0F0F030300000000000000000000C0C0C0C0000000000000000000000000 1256 DATA 116,0000000F0F0F0F0303030000000000003F0F3FFFFFFFC3C0F0F0FCFF3FFFFF33 1257 DATA 120,FFFFFFFFFFFFFFFFFF3F3FCF0F0F0F0FFFFFFFF0F0F0FCFCFCFFFFFFFFFFFFC0 1258 DATA 124,FFF0C000030F03000000C0F0FCFFFF3FC0F0C00C3CFF3F0F030000000000C0F0 1259 DATA 128,0000000000000000C0C0F0303000000000000000000000000000000000000000 1260 DATA 132,0000000000000000000000000000000000000000000000000000000003030300 1261 DATA 136,03030000000000030F0F0F3F3FFF3F33F0F0FCFC3C3FFFFFFCF0F0C0C0C0F0FC 1262 DATA 140,0F03C3CFFF3F3F3F3C3C3C0C0C0C0000F0F0F0C0C0C000000000000000000000 1270 SUBEND 1320 SUB XCHAR2 1330 FOR A=1 TO 3::READ P,S$::CALL CHAR(P,S$)::NEXT A 1350 REM CHARACTER DATA FOR ENEMY 1351 DATA 40,3FFF3F3F0C3FFFFFFFFF3F333333330C00C000000000C0C0C0300000000000C0 ENEMY LEFT 1352 DATA 44,0003000000000303030C000000000003FCFFFCFC30FCFFFFFFFFFCCCCCCCCC30 ENEMY RIGHT 1353 DATA 48,000000003FFF3F3F0C3FFFFFFFFF3F330000000000C000000000C0C0C0300000 ENEMY WINDOW 1360 SUBEND 1400 SUB XSPASH(XDEL,YV,TM1) 1410 DISPLAY AT(2,2):"BETA VERSION FOR SPEED TEST" 1420 DISPLAY AT(4,3):"RUN DELAY :";XDEL 1430 DISPLAY AT(5,3):"Y-SPEED :";YV 1440 DISPLAY AT(6,3):"SYNC TIME :";TM1 1450 SUBEND 1800 SUB XQUIT 1801 CALL CLEAR 1803 REM DISPLAY AT(8,3):"T H E E N D":: 1804 SUBEND 4100 SUB XSCAN(D,D1,K,S,FIRE,GUN,GUN1) 4110 CALL KEY(0,K,S) 4120 D1=D::FIRE=0::S=0::GUN1=GUN 4130 IF K=ASC("S") THEN D=-1::GUN=0::GUN1=0::GOTO 4180 4140 IF K=ASC("D") THEN D=1::GUN=0::GUN1=0::GOTO 4180 4150 IF K=ASC("L") THEN FIRE=1::GOTO 4180 4160 IF K=ASC("J") THEN GUN=1::GOTO 4180 4165 IF K=ASC("K") THEN GUN=0::GOTO 4180 4170 SUBEXIT 4180 S=1 4190 SUBEND 4200 SUB XGUN(D,X,Y,C,GUN,GUN1,XDEL1,S7) 4201 IF GUN=GUN1 THEN SUBEXIT 4202 CALL DELSPRITE(#7) 4210 IF GUN=0 THEN 4250 4213 IF D=-1 THEN CALL SPRITE(#7,96,C,X+8,Y-8) 4214 IF D=1 THEN CALL SPRITE(#7,96,C,X+8,Y+16) 4215 CALL LINK("DELAY",XDEL1) 4220 CALL PATTERN(#7,100)::CALL LINK("DELAY",XDEL1) 4230 CALL PATTERN(#7,104)::CALL LINK("DELAY",XDEL1) 4240 SUBEXIT 4250 IF D=-1 THEN CALL SPRITE(#7,104,C,X+8,Y-8) 4254 IF D=1 THEN CALL SPRITE(#7,104,C,X+8,Y+16) 4260 CALL LINK("DELAY",XDEL1) 4270 CALL PATTERN(#7,100)::CALL LINK("DELAY",XDEL1) 4280 CALL PATTERN(#7,96)::CALL LINK("DELAY",XDEL1) 4284 CALL DELSPRITE(#7) 4285 IF D=-1 THEN CALL SPRITE(#7,S7,C,X+16,Y-8) 4286 IF D=1 THEN CALL SPRITE(#7,S7,C,X+16,Y+16) 4290 SUBEND 4300 SUB XSHOT(D,X,Y,C,VX1,VY1,KILL) 4305 IF KILL=1 THEN SUBEXIT 4310 VX1=ABS(VX1)::VY1=ABS(VY1) 4320 IF D=-1 THEN 4340 4325 VX1=-VX1::CALL SPRITE(#8,36,C,X,Y+20,VX1,VY1)::GOTO 4350 4340 VX1=-VX1::VY1=-VY1::CALL SPRITE(#8,36,C,X,Y-20,VX1,VY1) 4350 KILL=1 4390 SUBEND 4400 SUB XLIMI(D,SP,HMIN,YMAX,HMIN1,YMIN,KILL) 4410 CALL POSITION(#SP,H,Y) 4420 IF D=-1 THEN 4440 4430 IF H>=HMIN AND Y=HMIN1 AND Y>YMIN THEN 4450 4445 CALL DELSPRITE(#8)::KILL=0 4450 SUBEND 4500 SUB XSLIDE(D,XDEL) 4510 CALL PATTERN(#6,140)::CALL LINK("DELAY",XDEL) 4520 CALL PATTERN(#5,136)::CALL LINK("DELAY",XDEL) 4530 CALL PATTERN(#6,132)::CALL LINK("DELAY",XDEL) 4540 CALL PATTERN(#5,128) 4590 SUBEND 4600 SUB XSWAP(D,S1,S2,S3,S4,S5,S6,S7) 4610 S1=112::S2=116::S3=120::S4=124::S5=128::S6=132::S7=108 4620 CALL XCHAR(D) 4690 SUBEND 4700 SUB XSHOW(D,S1,S2,S3,S4,S5,S6,S7,X,Y,C) 4710 IF D=-1 THEN GOTO 4760 4720 REM *** SPRITE RIGHT 4730 CALL SPRITE(#1,S1,C,X,Y,#2,S2,C,X,Y+8) 4735 CALL SPRITE(#3,S3,C,X+16,Y,#4,S4,C,X+16,Y+8,#7,S7,C,X+16,Y+16) 4740 CALL SPRITE(#5,S5,C,X+32,Y,#6,S6,C,X+32,Y+8) 4745 SUBEXIT 4750 REM *** SPRITE LEFT 4760 CALL SPRITE(#1,S1,C,X,Y+8,#2,S2,C,X,Y) 4765 CALL SPRITE(#3,S3,C,X+16,Y+8,#4,S4,C,X+16,Y,#7,S7,C,X+16,Y-8) 4770 CALL SPRITE(#5,S5,C,X+32,Y+8,#6,S6,C,X+32,Y) 4790 SUBEND 4800 SUB XMOVE(D,Y,YV) 4810 IF D=1 THEN IF Y+ABS(YV)<230 THEN 4840 4820 IF D=-1 THEN IF Y-ABS(YV)>10 THEN 4840 4830 SUBEXIT 4840 IF D=1 AND YV>0 THEN YV=YV*D::GOTO 4880 4850 IF D=-1 AND YV<0 THEN YV=YV::GOTO 4880 4860 IF D=1 AND YV<0 THEN YV=YV*-1::GOTO 4880 4870 IF D=-1 AND YV>0 THEN YV=YV*D::GOTO 4880 4880 Y=Y+YV 4890 SUBEND 4900 SUB XCOINC(HIT,HIT1,TOLL,YPOS) 4910 REM CHECK BULLET GUNSLINGER 4920 CALL COINC(#8,#10,TOLL,HIT)::GOTO 4945 4930 CALL COINC(#8,#11,TOLL,HIT)::GOTO 4945 4940 CALL COINC(#8,#12,TOLL,HIT)::GOTO 4945 4945 CALL POSITION(#8,XPOS,YPOS)::SUBEXIT 4950 REM CHECK BULLET ENEMY 4960 CALL COINC(#9,#7,TOLL,HIT1)::SUBEXIT 4965 CALL COINC(#9,#1,TOLL,HIT1)::SUBEXIT 4970 CALL COINC(#9,#2,TOLL,HIT1)::SUBEXIT 4975 CALL COINC(#9,#3,TOLL,HIT1)::SUBEXIT 4980 CALL COINC(#9,#4,TOLL,HIT1)::SUBEXIT 4985 CALL COINC(#9,#5,TOLL,HIT1)::SUBEXIT 4985 CALL COINC(#9,#6,TOLL,HIT1) 4990 SUBEND 5000 SUB XDEAD(YPOS,C,LIVES) 5010 CALL XCHAR1 5020 CALL SPRITE(#13,96,C,X,YPOS,#14,100,C,X,YPOS+8,#15,104,C,X,YPOS+16,#16,108,C,X,YPOS+24) 5030 CALL SPRITE(#17,112,C,X+8,YPOS,#18,116,C,X+8,YPOS+8,#19,120,C,X+8,YPOS+16,#20,124,C,X+8,YPOS+24) 5040 CALL SPRITE(#21,128,C,X+16,YPOS,#22,132,C,X+16,YPOS+8,#23,136,C,X+16,YPOS+16,#24,140,C,X+16,YPOS+24) 5050 LIVES=LIVES-1 5060 SUBEND 5100 SUB XGENR(ENPOS,ENFRQ,ENACT,BSPEED,LSPEED) 5110 CALL LINK("IRND",11,ENPOS)::REM ENEMY POSITION 5120 CALL LINK("IRND",10,ENFRQ)::REM ENEMY FREQ. ACTIVATION 5130 CALL LINK("IRND",10-LVL,ENACT)::REM ENEMY ACTIVE DURATION 5140 CALL LINK("IRND",6+LVL,BSPEED)::REM ENEMY BULLET SPEED 5150 CALL LINK("IRND",6+LVL,LSPEED)::REM GUNSLIGER SPEED 5160 SUBEND 5200 SUB XSCORE(LIVES,LVL,CNLVL,CNTSH,SCORE,HSCORE) 5210 CNTSH=CNTSH+1 5220 IF CNTSH=10 THEN CNTSH=0::LIVES=LIVES+1::CNTLVL=CNTLVL+1 5230 SCORE=SCORE+10::HSCORE=SCORE 5240 IF CNTLVL=2 THEN LVL=LVL+1 5250 SUBEND 8000 SUB WAIT(SEC) 8010 CALL KEY(0,K,S):: REM display at(1,1):"PRESS ANY KEY TO CONTINUE" 8020 IF SEC=0 THEN IF S=0 THEN 8010 8025 FOR T=1 TO SEC::NEXT T 8030 SUBEND