CHDIR ".\programs\samples\pete\tank" '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ' ' ±± ±± ±±±±±± ±±±±±± ±± ±±±±± ±±±±±± ±±± ±± ±±±±±± ' ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ' ±±±±±±±± ±± ±± ±±±±±± ±± ±± ±± ±± ±± ±±±± ±±±± ' ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±± ±±± ±± ' ±± ±± ±±±±±± ±± ±± ±± ±±±±±± ±±±±±± ±± ±± ±±±±± ' ' I N T E R A C T I V E E N T E R T A I N M E N T - 1 9 9 9 ' ' ' Game Name: Qbasic TANK COMMANDER version 2 ' Programmer: Matthew River Knight ' Completed: August 15, 1999 ' ' 'This game is a remake of the last TANK COMMANDER, having been improved and 'modified a great deal. The sprites now move very fluidly and without any 'flicker on 286 PCs and up. The code is also alot smaller than the last 'version and has been made as readable and easy to edit as possible. ' ' * * * * ' 'This is a two player game in which you and a friend drive about the arena 'in tanks trying to blow eachother up. You both have very powerfull tanks 'capable of driving through anything in your path. Even the most secure of 'fortresses stands no chance against these armoured beasts. Each of the tanks 'is equipt with powerfull bomb launchers, capable of blowing up the other 'tank beyond repair, with a single strike. ' 'The keys for the game are pretty standard, and have been designed to allow 'both players to play at the same keyboard without getting in eachothers way. 'You MUST ensure that NUMLOCK is ON before running the game !!! The keys 'are as follows: ' 'BLUE TANK - up: 8 ' down: 2 ' left: 4 ' right: 6 ' brakes: 5 ' shoot: 0 ' 'GREEN TANK - up: Q ' down: A ' left: O ' right: P ' brakes: S ' shoot: SPACE BAR ' ' * * * * ' 'The graphics for this game have been BSAVEd, and thus have to be loaded 'directly into memory to be drawn. This presents quite a problem because 'Qbasic often has quite a bit of trouble locating files that need to be 'BLOADed. This problem may be corrected by reffering to line 122 where there 'is a CHDIR. All you have to do is type the directory in which this game 'resides into the "" marks. ' 'Another potential problem with this game is the delay loop, which controls 'how fast the program runs. This game was designed on a computer using a 'CYRIX MII300 CPU, a 4MB graphics accelerator card and 512K cache - your 'computer may be faster or slower, and thus, for example, if you have a 'PENTIUM III, clocked at 500MHZ, this game will run so fast that it will be 'unplayable. ' 'This problem could have been eliminated by adding a CPU independant delay 'into the code by testing how fast your CPU is, however this presents us with 'another problem: different versions of Qbasic tend to give different results 'for these kinds of tests, and thus the game would have run inconsistantly 'on different platforms, even if they were being run on exactly the same 'kind of system. Since I wanted this game to be playable on any version of 'Qbasic, I chose to let everybody set the delay loop themselves. ' 'The delay loop variable is on line 125, under the name of Speed. All you 'have to do is change what it is = to. The default setting is 550 which is 'perfect for my system when running the game under WINDOWS 95 and on a Qbasic '4.5 platform. Just experiment with the setting until the game runs at a 'speed with which you are satisfied. Just remember that the lower the number 'Speed is = to, the faster the game is going to run! ' ' * * * * ' 'This game has been programmed from scratch by Matthew River Knight. All the 'code here is my own, with the exception of the FADE IN/OUT code which was 'kindly provided by Manny Najera of FLASH GAMES, on his web site. Any code 'that you find usefull in this game may be taken. The graphics files used 'in this game may not be taken, however. Please give this game to anybody, 'and everybody, though if you do, please DO NOT give them a modified version, 'and DO NOT remove this text! I spent ages making the code the way it is and 'personally I am very proud of it. Please leave it as it is! ' 'File list for Qbasic TANK COMMANDER v2: ' '* TCV2.BAS....................Game code file. '* ARENA.BSV...................BSAVEd graphics file for game arena. '* SPRITES.BSV.................BSAVEd graphics file for sprites. ' '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 'Define variables A-Z as integers. DEFINT A-Z 'Define the data TYPE, PaletteType. TYPE PaletteType Red AS INTEGER Green AS INTEGER Blue AS INTEGER END TYPE 'SHAREing of certain variables. DIM SHARED Pal AS PaletteType DIM SHARED pData(0 TO 255, 1 TO 3) 'Declaration of various SUBs. DECLARE SUB Palette.Set (nColor%, pInfo AS PaletteType) DECLARE SUB Palette.Get (nColor%, pInfo AS PaletteType) DECLARE SUB Palette.FadeOut () DECLARE SUB Palette.FadeIn () 'Change the default directory to the one being used for TANK COMMANDER. When 'setting this, remember to uncomment it. 'CHDIR "" 'Initial values of various variables. D1 = 2: D2 = 4: T1H = 6: T1V = 87: T2H = 300: T2V = 102: Speed = 550 'Customise the VGA color palette for the introductory text. SCREEN 13 C = 16: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * A) + (256 * 0) + 0: C = C + 1: NEXT C = 32: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * 0) + (256 * A) + 0: C = C + 1: NEXT C = 48: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * 0) + (256 * 0) + A: C = C + 1: NEXT C = 64: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * A) + (256 * A) + 0: C = C + 1: NEXT C = 80: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * A) + (256 * 0) + A: C = C + 1: NEXT C = 96: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * 0) + (256 * A) + A: C = C + 1: NEXT C = 112: B = 0: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * A) + (256 * B) + 0: B = B + 3: C = C + 1: NEXT C = 128: B = 0: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * B) + (256 * 0) + A: B = B + 3: C = C + 1: NEXT C = 144: B = 0: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * B) + (256 * A) + 0: B = B + 3: C = C + 1: NEXT C = 160: B = 0: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * B) + (256 * A) + A: B = B + 3: C = C + 1: NEXT C = 176: B = 0: FOR A = 16 TO 61 STEP 3: PALETTE C, (256 ^ 2 * A) + (256 * A) + A: C = C + 1: NEXT C = 192: B = 12: AA = 0: FOR A = 30 TO 62 STEP 2: PALETTE C, (256 ^ 2 * B) + (256 * AA) + A: B = B + 2: C = C + 1: NEXT C = 208: B = 12: AA = 0: FOR A = 30 TO 62 STEP 2: PALETTE C, (256 ^ 2 * B) + (256 * B) + A: B = B + 2: C = C + 1: NEXT C = 224: B = 12: AA = 0: FOR A = 30 TO 62 STEP 2: PALETTE C, (256 ^ 2 * AA) + (256 * B) + A: B = B + 2: C = C + 1: NEXT 'Do presentation text. Palette.FadeOut COLOR 1 LOCATE 9, 16: PRINT " HORIZONS Interactive Entertainment" LOCATE 13, 13: PRINT "P R E S E N T S" 'Color in company name with various shades of green. Y = 72: C = 32 DO FOR X = 1 TO 300 IF POINT(X, Y) > 0 THEN PSET (X, Y), C + RND * 15 NEXT Y = Y + 1 LOOP UNTIL Y = 79 'Color in "PRESENTS" with various shades of red. Once this has been done, 'fade in the screen, melt it, and then fade out. Y = 96: C = 49 DO FOR X = 1 TO 300 IF POINT(X, Y) > 0 THEN PSET (X, Y), C + RND * 14 NEXT Y = Y + 1 LOOP UNTIL Y = 103 Palette.FadeIn NOW! = TIMER: WHILE (TIMER - 1) < NOW!: WEND DIM Melt%(1500) FOR R = 1 TO 1500 RANDOMIZE TIMER X = INT(RND * 271) RANDOMIZE TIMER Y = INT(RND * 150) GET (X, Y)-(X + 48, Y + 18), Melt% PUT (X, Y + 1), Melt%, PSET IF INKEY$ = CHR$(27) THEN END NEXT Palette.FadeOut CLS : PALETTE: Palette.FadeOut 'GET the sprite data. DEF SEG = 40960: BLOAD "sprites.bsv" DIM Tank1(150): GET (1, 1)-(15, 10), Tank1 DIM Tank2(150): GET (1, 14)-(15, 23), Tank2 DIM Tank3(150): GET (1, 27)-(15, 36), Tank3 DIM Tank4(150): GET (1, 40)-(15, 49), Tank4 DIM Tank5(150): GET (20, 1)-(34, 10), Tank5 DIM Tank6(150): GET (20, 14)-(34, 23), Tank6 DIM Tank7(150): GET (20, 27)-(34, 36), Tank7 DIM Tank8(150): GET (20, 40)-(34, 49), Tank8 'Load the file ARENA.BSV, which is the graphics data for the arena, into the 'video memory segment (segment 40960). BLOAD "arena.bsv" 'Place both tanks in their initial positions and fade in the completed arena. PUT (T1H, T1V), Tank1, PSET PUT (T2H, T2V), Tank6, PSET Palette.FadeIn 'Main program loop. DO 'IF Count < Speed THEN Count = Count + 1 ELSE Count = 0 WAIT &H3DA, 8: WAIT &H3DA, 8, 8 IF Go1 = 1 AND Count = 0 THEN IF D1 = 1 AND T1V > 26 THEN T1V = T1V - 1: PUT (T1H, T1V), Tank3, PSET IF D1 = 2 AND T1H < 305 THEN T1H = T1H + 1: PUT (T1H, T1V), Tank1, PSET IF D1 = 3 AND T1V < 190 THEN T1V = T1V + 1: PUT (T1H, T1V), Tank4, PSET IF D1 = 4 AND T1H > 0 THEN T1H = T1H - 1: PUT (T1H, T1V), Tank2, PSET END IF IF Go2 = 1 AND Count = 0 THEN IF D2 = 1 AND T2V > 26 THEN T2V = T2V - 1: PUT (T2H, T2V), Tank7, PSET IF D2 = 2 AND T2H < 305 THEN T2H = T2H + 1: PUT (T2H, T2V), Tank5, PSET IF D2 = 3 AND T2V < 190 THEN T2V = T2V + 1: PUT (T2H, T2V), Tank8, PSET IF D2 = 4 AND T2H > 0 THEN T2H = T2H - 1: PUT (T2H, T2V), Tank6, PSET END IF IF St1 = 30 THEN St1 = 0: Fire1 = 0: PSET (B1H, B1V), Col IF St2 = 30 THEN St2 = 0: Fire2 = 0: PSET (B2H, B2V), Col2 IF Fire1 = 1 AND St1 < 30 AND Count = 0 THEN PSET (B1H, B1V), Col IF BD1 = 1 THEN B1V = B1V - 2 IF BD1 = 2 THEN B1H = B1H + 2 IF BD1 = 3 THEN B1V = B1V + 2 IF BD1 = 4 THEN B1H = B1H - 2 Col = POINT(B1H, B1V) PSET (B1H, B1V), 14 St1 = St1 + 1 GOSUB CheckBullet1 END IF IF Fire2 = 1 AND St2 < 30 AND Count = 0 THEN PSET (B2H, B2V), Col2 IF BD2 = 1 THEN B2V = B2V - 2 IF BD2 = 2 THEN B2H = B2H + 2 IF BD2 = 3 THEN B2V = B2V + 2 IF BD2 = 4 THEN B2H = B2H - 2 Col2 = POINT(B2H, B2V) PSET (B2H, B2V), 14 St2 = St2 + 1 GOSUB CheckBullet2 END IF Key$ = INKEY$ IF Key$ = CHR$(27) THEN Palette.FadeOut: GOTO Results IF Key$ = "4" THEN Go1 = 1: D1 = 4 IF Key$ = "6" THEN Go1 = 1: D1 = 2 IF Key$ = "8" THEN Go1 = 1: D1 = 1 IF Key$ = "2" THEN Go1 = 1: D1 = 3 IF Key$ = "0" THEN IF Fire1 = 0 THEN GOSUB Shoot1 IF Key$ = "5" THEN Go1 = 0 IF Key$ = "O" OR Key$ = "o" THEN Go2 = 1: D2 = 4 IF Key$ = "P" OR Key$ = "p" THEN Go2 = 1: D2 = 2 IF Key$ = "Q" OR Key$ = "q" THEN Go2 = 1: D2 = 1 IF Key$ = "A" OR Key$ = "a" THEN Go2 = 1: D2 = 3 IF Key$ = "S" OR Key$ = "s" THEN Go2 = 0 IF Key$ = CHR$(32) THEN IF Fire2 = 0 THEN GOSUB Shoot2 LOOP Shoot1: 'Initiates the shooting from Tank 1. BD1 = D1 IF BD1 = 0 THEN RETURN IF BD1 = 1 THEN B1H = (T1H + 7): B1V = (T1V - 1) IF BD1 = 2 THEN B1H = (T1H + 14): B1V = (T1V + 5) IF BD1 = 3 THEN B1H = (T1H + 7): B1V = (T1V + 11) IF BD1 = 4 THEN B1H = (T1H - 1): B1V = (T1V + 5) St1 = 1: Fire1 = 1: Col = POINT(B1H, B1V) RETURN Shoot2: 'Initiates the shooting from Tank 2. BD2 = D2 IF BD2 = 0 THEN RETURN IF BD2 = 1 THEN B2H = (T2H + 7): B2V = (T2V - 1) IF BD2 = 2 THEN B2H = (T2H + 14): B2V = (T2V + 5) IF BD2 = 3 THEN B2H = (T2H + 7): B2V = (T2V + 11) IF BD2 = 4 THEN B2H = (T2H - 1): B2V = (T2V + 5) St2 = 1: Fire2 = 1: Col2 = POINT(B2H, B2V) RETURN CheckBullet1: 'Hit detection from Tank 1 bullet. T2V = T2V + 2: T2H = T2H + 3 FOR ScanTank2 = 1 TO 7 FOR Scan = 1 TO 9 IF B1H = T2H AND B1V = T2V THEN Crash = 2: GOTO Explode T2H = T2H + 1 NEXT T2H = T2H - 9: T2V = T2V + 1 NEXT T2V = T2V - 9: T2H = T2H - 3 RETURN CheckBullet2: 'Hit detection from Tank 2 bullet. T1V = T1V + 2: T1H = T1H + 3 FOR ScanTank1 = 1 TO 7 FOR Scan = 1 TO 9 IF B2H = T1H AND B2V = T1V THEN Crash = 1: GOTO Explode T1H = T1H + 1 NEXT T1H = T1H - 9: T1V = T1V + 1 NEXT T1V = T1V - 9: T1H = T1H - 3 RETURN Explode: 'Create very cheap graphic explosion. IF Crash = 1 THEN ExplodeH = T1H: ExplodeV = T1V: T2Wins = 1 IF Crash = 2 THEN ExplodeH = T2H: ExplodeV = T2V: T1Wins = 1 FOR Explode = 1 TO 9 IF Explode = 1 THEN Col = 14 IF Explode = 5 THEN Col = 12 IF Explode = 7 THEN Col = 4 CIRCLE (ExplodeH, ExplodeV), Explode, Col NOW! = TIMER: WHILE (TIMER - .01) < NOW!: WEND NEXT NOW! = TIMER: WHILE (TIMER - 1) < NOW!: WEND Palette.FadeOut Results: 'Announce the winning tank and display credits. SCREEN 0: WIDTH 80, 25 COLOR 12, 4 PRINT " G A M E R E S U L T S " PRINT COLOR 4, 0 PRINT "Blue tank wins:" COLOR 2 LOCATE 3, 17: PRINT T1Wins COLOR 4 PRINT "Green tank wins:" COLOR 2 LOCATE 4, 18: PRINT T2Wins PRINT COLOR 12, 4 PRINT " C R E D I T S " PRINT COLOR 4, 0 PRINT "Concept:" PRINT "Programming:" PRINT "Game art:" PRINT "Fade effect:" PRINT "Testing:" PRINT "Debugging:" COLOR 2 LOCATE 8, 11: PRINT "About a million other un-origional programmers ;)" LOCATE 9, 15: PRINT "Matthew Knight" LOCATE 10, 12: PRINT "Matthew Knight" LOCATE 11, 15: PRINT "Manny Najera" LOCATE 12, 11: PRINT "Matthew Knight" LOCATE 13, 13: PRINT "Matthew Knight" PRINT COLOR 9 PRINT "All code in this game was programmed from scratch by Matthew Knight, with" PRINT "exception of the fade effect which was kindly supplied by Manny Najera." PRINT "No code was taken from any other games. Any similarity to another game is" PRINT "purely coincidental." PRINT COLOR 4 PRINT "Thank you for trying Qbasic TANK COMMANDER v2 !!!" PRINT "Hope you liked it :)" COLOR 7 SUB Palette.FadeIn DIM tT(1 TO 3) FOR I = 1 TO 64 WAIT &H3DA, 8, 8 FOR O = 0 TO 255 Palette.Get O, Pal tT(1) = Pal.Red tT(2) = Pal.Green tT(3) = Pal.Blue IF tT(1) < pData(O, 1) THEN tT(1) = tT(1) + 1 IF tT(2) < pData(O, 2) THEN tT(2) = tT(2) + 1 IF tT(3) < pData(O, 3) THEN tT(3) = tT(3) + 1 Pal.Red = tT(1) Pal.Green = tT(2) Pal.Blue = tT(3) Palette.Set O, Pal NEXT NEXT END SUB SUB Palette.FadeOut DIM tT(1 TO 3) FOR I = 0 TO 255 Palette.Get I, Pal pData(I, 1) = Pal.Red pData(I, 2) = Pal.Green pData(I, 3) = Pal.Blue NEXT FOR I = 1 TO 64 WAIT &H3DA, 8, 8 FOR O = 0 TO 255 Palette.Get O, Pal tT(1) = Pal.Red tT(2) = Pal.Green tT(3) = Pal.Blue IF tT(1) > 0 THEN tT(1) = tT(1) - 1 IF tT(2) > 0 THEN tT(2) = tT(2) - 1 IF tT(3) > 0 THEN tT(3) = tT(3) - 1 Pal.Red = tT(1) Pal.Green = tT(2) Pal.Blue = tT(3) Palette.Set O, Pal NEXT NEXT END SUB SUB Palette.Get (nColor%, pInfo AS PaletteType) OUT &H3C6, &HFF OUT &H3C7, nColor% pInfo.Red = INP(&H3C9) pInfo.Green = INP(&H3C9) pInfo.Blue = INP(&H3C9) END SUB SUB Palette.Set (nColor%, pInfo AS PaletteType) OUT &H3C6, &HFF OUT &H3C8, nColor% OUT &H3C9, pInfo.Red OUT &H3C9, pInfo.Green OUT &H3C9, pInfo.Blue END SUB