open window 640,512 U=16:D=64:L=128:R=32:X=16384:SQ=32768:TRI=4096:CIR=8192 R1=2048:R2=512:ST=8:L2=256:L1=1024:SEL=1 goto main label new_screen setdrawbuf buf buf=1-buf setdispbuf buf setrgb 1,10,10,10 setrgb 2,60,60,60 setrgb 3,10,10,10 gtriangle 0, 0 to 0,512 to 640,0 setrgb 1,60,60,60 gtriangle 640,512 to 0,512 to 640,0 return label draw_status '###- LIVE BAT -### setrgb 1,50,200-p(6,1)*10,50 rect 48,500,148,490 fill rect 48,500,48+p(7,1),490 setrgb 1,80-p(6,2)*3,80-p(6,2)*3,30 rect 198,500,298,490 fill rect 198,500,198+p(7,2),490 setrgb 1,50,50,200 rect 348,500,448,490 fill rect 348,500,348+p(7,3),490 setrgb 1,200,200,50 rect 497,500,597,490 fill rect 497,500,497+p(7,4),490 return label drive if p=1 k=peek("port1") if p=2 k=peek("port2") if p>=CPU then if p(7,p)>0 gosub CPU:goto CPU_in k=0 fi if CPD=CN goto game_over if p(7,p)<0 goto game_over '###-ACCLERATION-### ss = 10+(abs(p(4,p))*5) p(4,p)=p(4,p) + and(k,X)/(X*ss) - and(k,SQ)/(SQ*ss) p(4,p)=max(p(4,p),-1) : p(4,p)=min(p(4,p),2) if p(4,p)>0 p(4,p)=p(4,p)-.009 if p(4,p)<0 p(4,p)=p(4,p)+.008 '###-STEER-### ab=p(4,p) p(3,p)=p(3,p)+and(k,R)/R*ab-and(k,L)/L*ab p(3,p)=mod(p(3,p)+360,360) '###-CANON ANGLE-### p(5,p)=p(5,p)+and(k,R)/R*ab-and(k,L)/L*ab p(5,p)=p(5,p)+and(k,R1)/(R1/3)-and(k,L1)/(L1/3) p(5,p)=mod(p(5,p)+360,360) '###-SHOT-### if and(k,CIR)>0 p(6,p)=p(6,p)+.3 if (and(k,CIR)<>CIR and p(6,p)>3)or(p(6,p)>15) then gosub new_shot p(6,p)=0 endif label CPU_in '###-VERTICAL VELOCITY-### p(1,p)=p(1,p) - p(4,p)*si(p(3,p)) '###-HORICONTAL VELOCITY-### p(2,p)=p(2,p) + p(4,p)*co(p(3,p)) if p(7,p)>0 then if p(1,p) >640 p(1,p) = 1 if p(1,p) <0 p(1,p) = 639 if p(2,p) >512 p(2,p) = 1 if p(2,p) <0 p(2,p) = 511 endif '###-RESET-### if k=ST gosub paused if k=SEL goto main return label new_shot if shot>=max_shot shot=0 shot=shot+1 s(1,shot) = p(1,p)-20*si(p(5,p)):rem X POS s(2,shot) = p(2,p)+20*co(p(5,p)):rem Y POS s(3,shot) = p(6,p) :rem ACCLERATION s(4,shot) = p(5,p) :rem ANGLE return label CPU k=0 if p(7,p)<0 gosub DEAD if int(ran(20))=2 gosub search '###-CHANGE ANGLE-### if p(3,p)p(8,p) p(5,p) = p(5,p) - 3 if p(5,p)p(8,p)-2 then if p(10,p)<=0 gosub new_shot p(10,p) = 50 endif p(10,p) = p(10,p) - 1 '###-CHANGE SPEED-### if p(4,p)80 then if p(2,PT)+40p(1,p) p(8,p)=225 elsif p(2,PT)-40>p(2,p) then if p(1,PT)p(1,p) p(8,p)=315 else if p(1,PT)p(1,p) p(8,p)=270 endif else if p(1,PT)p(1,p) p(8,p)=360 endif '###-SPEED-### if abs(p(1,PT)-p(1,p))>140 or abs(p(2,PT)-p(2,p))>140 then p(9,p)=2 : p(6,p)=9 else p(9,p)=.8: p(6,p)=4 endif '###-CHANGE TARGET-### if p(10,p)>40 then if p=2 then p(11,p)=1 if abs(p(1,3)-p(1,p))>80 and p(7,3)>0 p(11,p)=3 if abs(p(1,4)-p(1,p))>80 and p(7,4)>0 p(11,p)=4 endif if p>2 then if abs(p(1,1)-p(1,p))>80 and p(7,1)>0 p(11,p)=1 if abs(p(1,2)-p(1,p))>80 and p(7,2)>0 p(11,p)=2 endif endif return label DEAD restore DEAD for arg=1 to 10 read p(arg,p) data -100,-100,0,0,0,0,0,0,0,0,0 next CPD=CPD+1 return label explosives b=0:repeat:b=b+1 if s(3,b) > 0 then s(3,b) = s(3,b) - .06 on gamemode goto 1,2 1 if s(1,b) > 640 s(1,b) = 1 if s(1,b) < 0 s(1,b) = 639 if s(2,b) > 512 s(2,b) = 1 if s(2,b) < 0 s(2,b) = 511 goto 0 2 if s(1,b) > 640 goto 22 if s(1,b) < 0 goto 22 if s(2,b) > 512 goto 22 if s(2,b) < 0 goto 22 goto 0 22 s(4,b) = s(4,b) - 90 s(4,b) = mod(s(4,b)+360,360) 0 rem DO NOTHING =) if s(5,b)>0 s(5,b)=s(5,b)-.1 WS=-s(3,b)*si(s(4,b)) VS= s(3,b)*co(s(4,b)) s(1,b) = s(1,b) + WS s(2,b) = s(2,b) + VS '###-SHOT COLLISION-### gosub check_shot_col setrgb 1,200,200,100 line s(1,b),s(2,b),s(1,b)+WS,s(2,b)+VS endif '###-EXPLOSIONS-### if s(3,b)<.2 and s(3,b)<>0 then s(3,b)=0 ex(1,b)=s(1,b) ex(2,b)=s(2,b) ex(3,b)=30+ran(15) endif if ex(3,b) > 0 then gosub draw_explo gosub check_collision endif until(b=max_shot) return label check_shot_col p=0:repeat:p=p+1 '###- X AREA -### if (s(1,b)>px(1,p) and s(1,b)px(3,p)) then '###- Y AREA -### if (s(2,b)>py(1,p) and s(2,b)py(3,p)) then s(3,b) = .1 endif:endif until(p=pln) return label check_collision p=0:repeat:p=p+1 if abs(ex(1,b)-p(1,p))<25 and abs(ex(2,b)-p(2,p))<25 then p(7,p) = p(7,p) - ex(3,b)*.05 endif until(p=pln) return label draw_explo ex(3,b)=ex(3,b)-2 ea=0 setrgb 1,ex(3,b)*10,ex(3,b)*3,0 setrgb 2,ex(3,b)*10,ex(3,b)*8,0 setrgb 3,ex(3,b)*10,ex(3,b)*8,0 repeat:ea=ea+60 gtriangle ex(1,b),ex(2,b) to ex(1,b)+ex(3,b)*si(ea),ex(2,b)+ex(3,b)*co(ea) to ex(1,b)+ex(3,b)*si(ea+60),ex(2,b)+ex(3,b)*co(ea+60) until(ea=360) return label draw 'CANON TRIS n=(pn-4)*3:repeat:n=n+1 px(n,p)=p(1,p)+(x(n)*co(p(5,p))-y(n)*si(p(5,p))) py(n,p)=p(2,p)+(x(n)*si(p(5,p))+y(n)*co(p(5,p))) until(n=pn*3) 'TANK TRIS n=0:repeat:n=n+1 px(n,p)=p(1,p)+(x(n)*co(p(3,p))-y(n)*si(p(3,p))) py(n,p)=p(2,p)+(x(n)*si(p(3,p))+y(n)*co(p(3,p))) until(n=(pn-4)*3) '### DRAW TANK ### n=1:repeat setrgb 1,pc(n,p),pc(n+1,p),pc(n+2,p) fill triangle px(n,p),py(n,p) to px(n+1,p),py(n+1,p) to px(n+2,p),py(n+2,p) n=n+3 until(n>=pn*3) return '################# '# SETUP & MENUS # '################# label setup pn=8: rem POLYS/VEHICLE size=.6 max_shot=5 pln=4 dim x(pn*3),y(pn*3),px(pn*3,pln),py(pn*3,pln) dim si(720),co(720),p(11,pln),s(10,max_shot) dim ex(6,max_shot),pc(pn*3,pln) title$="T|A|N|K|S" help$="X - ACCLERATE\nSQUARE - BRAKE/REVERSE\n" help$=help$+"R1/L1 - MOVE CANON\nSTART - PAUSE\n\n" help$=help$+"HOLD THE CIRCLE BUTTON TO ACCLERATE\n" help$=help$+"YOUR SHOT" about$="T|A|N|K|S coded by Tappi with help\n" about$=about$+"from the forums at yabasic.co.uk" greetN = 3 dim greet$(greetN) restore setup for g=1 to greetN read greet$(g) next for b=0 to 720 si(b)=sin(b/180*pi) co(b)=cos(b/180*pi) next gosub vehicle data "Hallo","du","" return label init_game 'p(arg,player) ' arguments: '1 = X POSITION '2 = Y POSITION '3 = ANGLE '4 = ACCLERATION '5 = CANON ANGLE '6 = SHOT ACCLERATION '7 = DAMAGE restore init_game for p=1 to pln for arg=1 to 10:p(arg,p)=0:next next for p=CPU to pln p(1,p)=p*60 : p(2,p) = 100 p(7,p)=100 : p(5,p) = 290 p(10,p)=10 : p(11,p)= 1 next for arg=1 to 7 read p(arg,1) data 400,450,180,0,180,0,100 next for arg=1 to 7 read p(arg,2) data 500,450,180,0,180,0,100 next for b=1 to max_shot ex(3,b) =0 s(3,b) =0 next CPD=0 return label vehicle restore vehicle for n=1 to pn*3 read x(n),y(n) x(n) = x(n)*size y(n) = y(n)*size next restore v_colour for p=1 to pln for n=1 to pn*3 read pc(n,p) next:next rem 3 COORDINATES PER TRI ---1--- ---2--- --3--- rem -X- -Y- -X- -Y- -X- -Y- | -X- -Y- -X- -Y- -X- -Y- rem "BODY" data 20, 30,-20, 30,-20,-30, 20, 30, 20,-30,-20,-30 rem FRONT data 20, 30, 17, 42,-17, 42, 20, 30,-20, 30,-17, 42 rem CANON data 15,-10,-15,-10,-15, 10, -15, 10, 15, 10, 15,-10 data 5,-10, -5,-10, -5, 45, 5, 45, -5, 45, 5,-10 return label v_colour rem -R-|-G-|-B- -R-|-G-|-B- data 10,100, 10, 10,100, 10 data 20, 70, 20, 20, 70, 20 data 0, 60, 0, 0, 60, 0 data 10, 90, 10, 10, 90, 10 'PLAYER 2 data 110,100, 10, 110,100, 10 data 90, 80, 10, 90, 80, 10 data 80, 70, 10, 80, 70, 10 data 80, 80, 30, 80, 80, 30 'PLAYER 3 data 50, 50,150, 50, 50,150 data 50, 50,130, 50, 50,130 data 10, 10, 80, 10, 10, 80 data 30, 30,100, 30, 30,100 'PLAYER 4 data 150,150, 50, 150,150, 50 data 140,140, 50, 140,140, 50 data 120,120, 60, 120,120, 60 data 100, 90, 10, 100, 90, 10 label T_logo A=0:B=0:C=0 while(C<200 and k=0) k=peek("port1") restore T_logo setdrawbuf buf: buf=1-buf:setdispbuf buf clear window if B>200 and C<1 A=A+4 if B<204 B=B+4 if A>200 C=C+1 LL=(204-B)/2 setrgb 1,B-A,B-A,B-A fill rect 210-LL,190-LL,430+LL,310+LL setrgb 1,0,A-C,A/2-C/2 text 211,300, "coded by tappi","lc" for RT=0 to 23 read RD fill rect 215+RT*8.7,200,215+RD+(RT*8.7)-LL/5,285 next rem EAN CODE data 5,4,5,5,4,5,3,4,2,3,3,5 data 3,4,3,4,2,3,2,3,4,2,4,3 wend return label pad_menu k=peek("port1") if and(k,D)>0 and P=0 then:P=1:ms=ms+1:fi if and(k,U)>0 and P=0 then:P=1:ms=ms-1:fi ms=min(3,ms) : ms=max(1,ms) if and(k,X)>0 and P=0 then:P=1:md=ms+MD:fi if k=0 P=0 on md gosub bats,start,help,about,norm,boun,retu,oneP,twoP,retu return label norm restore norm data "1 PLAYER","2 PLAYER","BACK" MD=7:gamemode=1:goto 011 label boun restore boun data "1 PLAYER","2 PLAYER","BACK" MD=7:gamemode=2:goto 011 label retu MD=1:md=0:ms=0:return label oneP CPU=2:CN=3 MD=5:md=0:return label twoP CPU=3:CN=2 MD=5:md=0:return label start MD=4 restore start data "CLASSIC-MODE","BOUNCE-MODE","BACK" goto 011 label bats MD=1 restore bats data "START","HELP","ABOUT" 011 m=0 repeat:m=m+1 dim m$(m) read m$(m) setrgb 1,90,90,90 : setrgb 2,50,50,50 : setrgb 3,50,50,50 if m=ms setrgb 1,130,130,130 B=m*60 mz=mz+.1 A=5*sin(mz) if m<>ms A=0 gtriangle 250-A,200+B-A to 250-A,250+B+A to 390-A,250+B-A setrgb 2,90,90,90 if m=ms setrgb 2,130,130,130 gtriangle 250-A,200+B-A to 390-A,200+B+A to 390-A,250+B-A setrgb 1,10,10,10 text 320,210+B, m$(m),"ct" until(m=3) return label draw_titlescreen B=len(title$)*11 setrgb 1,90,90,90 setrgb 2,50,50,50 setrgb 3,50,50,50 gtriangle 320-B,100 to 320-B,200 to 320+B,200 setrgb 2,90,90,90 gtriangle 320-B,100 to 320+B,100 to 320+B,200 setrgb 1,120,120,120 text 323,155,title$,"cc" setrgb 1,70,70,70 text 320,158,title$,"cc" return label help setrgb 1,160,160,160 text 145,248, "HELP","lc" line 100,262,540,262 : line 130,230,130,400 text 145,388, help$,"lc" if k<>0 and P=0 then P=1:md=0:fi ms=2 return label about setrgb 1,160,160,160 text 145,248, "INFO","lc" line 100,262,540,262 : line 130,230,130,400 text 145,298, about$,"lc" greet = greet + .04:greet=mod(greet,greetN) text 145,328, "Greetings to","lc" setrgb 1,0,0,0 text 145,358, greet$(greet) if k<>0 and P=0 then P=1:md=0:fi ms=3 return label menu MD=1:md=0:ms=0:mx=0 repeat:until(peek("port1")=0) repeat gosub new_screen gosub draw_titlescreen gosub pad_menu until(MD=5) return '=========================================== label main gosub T_logo gosub setup gosub menu gosub init_game gosub start_game label loop gosub new_screen gosub draw_status gosub explosives p=0:repeat:p=p+1 gosub drive gosub draw if p(7,p)<0 gosub DEAD until(p=pln) goto loop label game_over repeat:until(peek("port1")=0) setdrawbuf buf for TX=-1 to 1 : for TY = -1 to 1 setrgb 1,150,150,150 text 320+TX*2,250-TY*2,"GAME OVER","cc" setrgb 1,100,100,100 text 320+TX*2,450-TY*2,"Press START","cc" next:next setrgb 1,0,0,0 text 320,250, "GAME OVER","cc" text 320,450, "Press START","cc" setdispbuf buf repeat:until(peek("port1")=ST) goto main label paused repeat:until(peek("port1")=0) setdrawbuf buf for TX=-1 to 1 : for TY = -1 to 1 setrgb 1,220,220,220 text 320+TX*2,250-TY*2,"PAUSE","cc" setrgb 1,200,220,200 text 320+TX*2,450-TY*2,"Press START","cc" next:next setrgb 1,0,0,0 text 320,250, "PAUSE","cc" text 320,450, "Press START","cc" setdispbuf buf repeat:until(peek("port1")=ST) repeat:until(peek("port1")=0) return label start_game count=4 repeat:count=count-.06 gosub new_screen gosub draw_status p=0:repeat:p=p+1 gosub draw until(p=pln) for TX = -1 to 1 : for TY = -1 to 1 setrgb 1,140,140,140 text 320+TX*2,250-TY*2, "GET READY","cc" setrgb 1, 50,150, 50 text 400+TX*2,400-TY*2, "PLAYER 1","cc" setrgb 1, 90, 90, 0 text 500+TX*2,400-TY*2, "PLAYER 2","cc" setrgb 1, 80, 80, 80 text 320+TX*2,290-TY*2, str$(int(count)),"cc" next:next setrgb 1,0,0,0 text 320,250, "GET READY","cc" text 400,400, "PLAYER 1","cc" text 500,400, "PLAYER 2","cc" text 320,290, str$(int(count)),"cc" until(count<1) return