rem 8 Tanks rem by Fort Apocalypse rem written in bB 1.5 rem A game for 8 players with a Quadtari and rem 4 sets of paddles, each player using the rem paddle button to control their tank. rem To compile: ensure you are in a directory rem that has the Quadtari DPCplus_kernel.asm rem from: rem https://atariage.com/forums/topic/316896-quadtari-sample-code-for-bb/ include div_mul.asm set kernel DPC+ set tv ntsc goto __Bank_2 bank2 bank 2 temp1=temp1 __Bank_2 rem Quadtari magic dim qtcontroller=y rem Quadtari detection for Stella data quadtari_detection $1B, $1F, $0B, $0E, $1E, $0B, $1C, $13 end DF4FRACINC = 0 pfcolors: $9C end DF6FRACINC = 0 bkcolors: $C4 end scorecolors: $C4 $C4 $C4 $C4 $C4 $C4 $C4 $C4 end player0color: $0E $0E $0E $0E $0E $0E $0E $0E $0E $0E end player1-9color: $0E $0E $0E $0E $0E $0E $0E $0E $0E $0E end DF0FRACINC = 128 ; Column 0. DF1FRACINC = 128 ; Column 1. DF2FRACINC = 128 ; Column 2. DF3FRACINC = 128 ; Column 3. const pfscore=1 dim player0dir=a dim player1dir=b dim player2dir=c dim player3dir=d dim player4dir=e dim player5dir=f dim player6dir=g dim player7dir=h rem persist button presses by setting bits on fires. rem for example, fires{0} is set to persist button press of player 0 dim fires=i dim balldist=j dim balldir=k dim unused=m dim timern=n goto __Bank_3 bank3 bank 3 temp1=temp1 __Bank_3 init1 missile0height=2 missile1height=2 ballheight=2 playfield: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X X..............................X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX end playfieldpos=8 initgame initround gosub player0home gosub player1home gosub player2home gosub player3home gosub player4home gosub player5home gosub player6home gosub player7home mainloop n=n+1 pfscorecolor=$9C rem Quadtari registers paddle buttons as joystick rem going left or right (corresponding to each paddle). rem you can only check two (pairs) at a time. rem the idea here is that you can control the tank rem by holding the button down to move forward or rem by releasing the button to turn clockwise. if qtcontroller then goto paddleset3and4 if joy0left then fires{0}=1 else player0dir=player0dir+1 : fires{0}=0 if joy0right then fires{1}=1 else player1dir=player1dir+1 : fires{1}=0 if joy1left then fires{2}=1 else player2dir=player2dir+1 : fires{2}=0 if joy1right then fires{3}=1 else player3dir=player3dir+1 : fires{3}=0 qtcontroller=1 goto aftercheckpaddles paddleset3and4 if joy0left then fires{4}=1 else player4dir=player4dir+1 : fires{4}=0 if joy0right then fires{5}=1 else player5dir=player5dir+1 : fires{5}=0 if joy1left then fires{6}=1 else player6dir=player6dir+1 : fires{6}=0 if joy1right then fires{7}=1 else player7dir=player7dir+1 : fires{7}=0 qtcontroller=0 aftercheckpaddles temp5=player0dir/32 : temp4=player0x : temp7=player0y if temp5>4 then temp6=255 : REFP0=8 else temp6=1 if n&3>0 then goto afterdirplayer7 on temp5 goto player0u player0ur player0r player0dr player0d player0dr player0r player0ur afterdirplayer0 temp5=player1dir/32 : temp4=player1x : temp7=player1y if temp5>4 then temp6=255 : _NUSIZ1{3}=1 else temp6=1 : _NUSIZ1{3}=0 on temp5 goto player1u player1ur player1r player1dr player1d player1dr player1r player1ur afterdirplayer1 temp5=player2dir/32 : temp4=player2x : temp7=player2y if temp5>4 then temp6=255 : NUSIZ2{3}=1 else temp6=1 : NUSIZ2{3}=0 on temp5 goto player2u player2ur player2r player2dr player2d player2dr player2r player2ur afterdirplayer2 temp5=player3dir/32 : temp4=player3x : temp7=player3y if temp5>4 then temp6=255 : NUSIZ3{3}=1 else temp6=1 : NUSIZ3{3}=0 on temp5 goto player3u player3ur player3r player3dr player3d player3dr player3r player3ur afterdirplayer3 temp5=player4dir/32 : temp4=player4x : temp7=player4y if temp5>4 then temp6=255 : NUSIZ4{3}=1 else temp6=1 : NUSIZ4{3}=0 on temp5 goto player4u player4ur player4r player4dr player4d player4dr player4r player4ur afterdirplayer4 temp5=player5dir/32 : temp4=player5x : temp7=player5y if temp5>4 then temp6=255 : NUSIZ5{3}=1 else NUSIZ5{3}=0 on temp5 goto player5u player5ur player5r player5dr player5d player5dr player5r player5ur afterdirplayer5 temp5=player6dir/32 : temp4=player6x : temp7=player6y if temp5>4 then temp6=255 : NUSIZ6{3}=1 else temp6=1 : NUSIZ6{3}=0 on temp5 goto player6u player6ur player6r player6dr player6d player6dr player6r player6ur afterdirplayer6 temp5=player7dir/32 : temp4=player7x : temp7=player7y if temp5>4 then temp6=255 : NUSIZ7{3}=1 else temp6=1 : NUSIZ7{3}=0 on temp5 goto player7u player7ur player7r player7dr player7d player7dr player7r player7ur afterdirplayer7 if player0x<19 then player0x=19 if player1x<19 then player1x=19 if player2x<19 then player2x=19 if player3x<19 then player3x=19 if player4x<19 then player4x=19 if player5x<19 then player5x=19 if player6x<19 then player6x=19 if player7x<19 then player7x=19 if player0x>133 then player0x=133 if player1x>133 then player1x=133 if player2x>133 then player2x=133 if player3x>133 then player3x=133 if player4x>133 then player4x=133 if player5x>133 then player5x=133 if player6x>133 then player6x=133 if player7x>133 then player7x=133 if player0y<2 then player0y=2 if player1y<2 then player1y=2 if player2y<2 then player2y=2 if player3y<2 then player3y=2 if player4y<2 then player4y=2 if player5y<2 then player5y=2 if player6y<2 then player6y=2 if player7y<2 then player7y=2 if player0y>171 then player0y=171 if player1y>171 then player1y=171 if player2y>171 then player2y=171 if player3y>171 then player3y=171 if player4y>171 then player4y=171 if player5y>171 then player5y=171 if player6y>171 then player6y=171 if player7y>171 then player7y=171 if balldist=0 then bally=240 : goto afterdirball balldist=balldist-1 on balldir goto ballu ballur ballr balldr balld balldl balll ballul afterdirball drawscreen goto mainloop ballu bally=bally-4 goto afterdirball ballur ballx=ballx+2 : bally=bally-2 goto afterdirball ballr ballx=ballx+4 goto afterdirball balldr ballx=ballx+2 : bally=bally+2 goto afterdirball balld bally=bally+4 goto afterdirball balldl ballx=ballx-2 : bally=bally+2 goto afterdirball balll ballx=ballx-4 goto afterdirball ballul ballx=ballx-2 : bally=bally-2 goto afterdirball player0home player0x=30 : player0y=15 : player0dir=0 return player1home player1x=120 : player1y=35 : player1dir=0 return player2home player2x=30 : player2y=55 : player2dir=0 return player3home player3x=120 : player3y=75 : player3dir=0 return player4home player4x=30 : player4y=95 : player4dir=0 return player5home player5x=120 : player5y=115 : player5dir=0 return player6home player6x=30 : player6y=135 : player6dir=0 return player7home player7x=120 : player7y=155 : player7dir=0 return player0u player0: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{0} then player0y=player0y-2 : gosub shoot goto afterdirplayer0 player0ur player0: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{0} then player0x=player0x+temp6 : player0y=player0y-1 : gosub shoot goto afterdirplayer0 player0r player0: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{0} then player0x=player0x+temp6+temp6 : gosub shoot goto afterdirplayer0 player0dr player0: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{0} then player0x=player0x+temp6 : player0y=player0y+1 : gosub shoot goto afterdirplayer0 player0d player0: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{0} then player0y=player0y+2 : gosub shoot goto afterdirplayer0 player1u player1: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{1} then player1y=player1y-2 : gosub shoot goto afterdirplayer1 player1ur player1: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{1} then player1x=player1x+temp6 : player1y=player1y-1 : gosub shoot goto afterdirplayer1 player1r player1: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{1} then player1x=player1x+temp6+temp6 : gosub shoot goto afterdirplayer1 player1dr player1: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{1} then player1x=player1x+temp6 : player1y=player1y+1 : gosub shoot goto afterdirplayer1 player1d player1: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{1} then player1y=player1y+2 : gosub shoot goto afterdirplayer1 player2u player2: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{2} then player2y=player2y-2 : gosub shoot goto afterdirplayer2 player2ur player2: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{2} then player2x=player2x+temp6 : player2y=player2y-1 : gosub shoot goto afterdirplayer2 player2r player2: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{2} then player2x=player2x+temp6+temp6 : gosub shoot goto afterdirplayer2 player2dr player2: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{2} then player2x=player2x+temp6 : player2y=player2y+1 : gosub shoot goto afterdirplayer2 player2d player2: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{2} then player2y=player2y+2 : gosub shoot goto afterdirplayer2 player3u player3: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{3} then player3y=player3y-2 : gosub shoot goto afterdirplayer3 player3ur player3: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{3} then player3x=player3x+temp6 : player3y=player3y-1 : gosub shoot goto afterdirplayer3 player3r player3: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{3} then player3x=player3x+temp6+temp6 : gosub shoot goto afterdirplayer3 player3dr player3: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{3} then player3x=player3x+temp6 : player3y=player3y+1 : gosub shoot goto afterdirplayer3 player3d player3: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{3} then player3y=player3y+2 : gosub shoot goto afterdirplayer3 player4u player4: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{4} then player4y=player4y-2 : gosub shoot goto afterdirplayer4 player4ur player4: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{4} then player4x=player4x+temp6 : player4y=player4y-1 : gosub shoot goto afterdirplayer4 player4r player4: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{4} then player4x=player4x+temp6+temp6 : gosub shoot goto afterdirplayer4 player4dr player4: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{4} then player4x=player4x+temp6 : player4y=player4y+1 : gosub shoot goto afterdirplayer4 player4d player4: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{4} then player4y=player4y+2 : gosub shoot goto afterdirplayer4 player5u player5: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{5} then player5y=player5y-2 : gosub shoot goto afterdirplayer5 player5ur player5: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{5} then player5x=player5x+temp6 : player5y=player5y-1 : gosub shoot goto afterdirplayer5 player5r player5: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{5} then player5x=player5x+temp6+temp6 : gosub shoot goto afterdirplayer5 player5dr player5: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{5} then player5x=player5x+temp6 : player5y=player5y+1 : gosub shoot goto afterdirplayer5 player5d player5: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{5} then player5y=player5y+2 : gosub shoot goto afterdirplayer5 player6u player6: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{6} then player6y=player6y-2 : gosub shoot goto afterdirplayer6 player6ur player6: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{6} then player6x=player6x+temp6 : player6y=player6y-1 : gosub shoot goto afterdirplayer6 player6r player6: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{6} then player6x=player6x+temp6+temp6 : gosub shoot goto afterdirplayer6 player6dr player6: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{6} then player6x=player6x+temp6 : player6y=player6y+1 : gosub shoot goto afterdirplayer6 player6d player6: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{6} then player6y=player6y+2 : gosub shoot goto afterdirplayer6 player7u player7: %00010000 %00010000 %01111100 %01111100 %01111100 end if fires{7} then player7y=player7y-2 : gosub shoot goto afterdirplayer7 player7ur player7: %00000000 %00110100 %01111000 %00111100 %00011000 end if fires{7} then player7x=player7x+temp6 : player7y=player7y-1 : gosub shoot goto afterdirplayer7 player7r player7: %01110000 %01110000 %01111100 %01110000 %01110000 end if fires{7} then player7x=player7x+temp6+temp6 : gosub shoot goto afterdirplayer7 player7dr player7: %00011000 %00111100 %01111000 %00110100 %00000000 end if fires{7} then player7x=player7x+temp6 : player7y=player7y+1 : gosub shoot goto afterdirplayer7 player7d player7: %00111110 %00111110 %00111110 %00001000 %00001000 end if fires{7} then player7y=player7y+2 : gosub shoot goto afterdirplayer7 shoot rem temp5 is the 0-7 direction. rem temp4,temp7 is x,y of firing location. rem if ball isn't in flight and current player can shoot, it shoots. if balldist>0 then return balldir=temp5 : ballx=temp4+5 : bally=temp7+2 : balldist=20 return goto __Bank_4 bank4 bank 4 temp1=temp1 __Bank_4