'* * * * * * * * * * * * * ' GET/PUT Demo * ' Written by Vince Long * ' November 2001 * '* * * * * * * * * * * * * SCREEN 12 cycles = 12 level = 7 GOSUB Splash Menu: LOCATE 2, 32 PRINT "The Gate Crusher" LOCATE 5, 32 PRINT " by Vince Long" LOCATE 15, 30 PRINT "1. Play the game" LOCATE 17, 30 PRINT "2. Read instructions" LOCATE 19, 30 PRINT "3. Quit" DO I$ = INKEY$ LOOP WHILE I$ = "" ON VAL(I$) GOTO Start, Instructions, Shutdown GOTO Menu Shutdown: CLS SCREEN 0 END Start: '* * * * * * * * * * * * * * * * * ' Setup the Variables and Stuff * '* * * * * * * * * * * * * * * * * CLEAR RANDOMIZE TIMER DIM SnapShot(500), ship(500), mybase(500) DIM c1(300), c2(300), c3(300), c4(300), c5(300), c6(300) DIM baseshot(500) level = 7 gatedelay = level CLS x = 30 y = 29 basex = INT(560 * RND(1) + 1) + 40 fuel = 5000 '* * * * * * * * * ' Draw the Stars * '* * * * * * * * * FOR ScreenSweeps = 1 TO 8 FOR StarX = 1 TO 640 magnitude = INT(RND * 3) + 1 IF magnitude = 1 THEN StarColor = 7 IF magnitude = 2 THEN StarColor = 8 IF magnitude = 3 THEN StarColor = 15 PSET (StarX, INT(RND * 480) + 1), StarColor NEXT StarX NEXT ScreenSweeps GOSUB DrawMaze ' * * * * * * * * * * ' Draw Base ' * * * * * * * * * * GET (basex - 11, 381 - 11)-(basex + 11, 381 + 11), baseshot CIRCLE (basex, 381), 10, 14 PAINT (basex, 381), 5, 14 GET (x - 13, y - 13)-(x + 13, y + 13), SnapShot GOSUB DrawGates m = 4 GOSUB DrawShip ' Put Up the Initial Comets FOR I = 1 TO 6 cometx(I) = INT(520 * RND(1) + 1) + 100 NEXT I comety(1) = 80 comety(2) = 130 comety(3) = 180 comety(4) = 230 comety(5) = 280 comety(6) = 330 GET (cometx(1) - 7, comety(1) - 7)-(cometx(1) + 7, comety(1) + 7), c1 GET (cometx(2) - 7, comety(2) - 7)-(cometx(2) + 7, comety(2) + 7), c2 GET (cometx(3) - 7, comety(3) - 7)-(cometx(3) + 7, comety(3) + 7), c3 GET (cometx(4) - 7, comety(4) - 7)-(cometx(4) + 7, comety(4) + 7), c4 GET (cometx(5) - 7, comety(5) - 7)-(cometx(5) + 7, comety(5) + 7), c5 GET (cometx(6) - 7, comety(6) - 7)-(cometx(6) + 7, comety(6) + 7), c6 FOR I = 1 TO 6 CIRCLE (cometx(I), comety(I)), 6, 2 PAINT (cometx(I), comety(I)), 10, 2 NEXT I '* * * * * * * * * * * * * * * * ' Start the Main Program Here * '* * * * * * * * * * * * * * * * GOSUB DrawShip DO I$ = INKEY$ oldx = x: oldy = y IF I$ = CHR$(0) + "H" THEN m = 1 IF I$ = CHR$(0) + "P" THEN m = 2 IF I$ = CHR$(0) + "K" THEN m = 3 IF I$ = CHR$(0) + "M" THEN m = 4 IF I$ = CHR$(32) THEN m = 0 IF I$ = "1" THEN Speed = 1 IF I$ = "2" THEN Speed = 2 IF I$ = "3" THEN Speed = 3 'IF I$ = "4" THEN speed = 4 'IF I$ = "5" THEN speed = 5 'IF I$ = "6" THEN speed = 6 'IF I$ = "7" THEN speed = 7 'IF I$ = "8" THEN speed = 8 'IF I$ = "9" THEN speed = 9 IF m = 1 THEN y = y - Speed IF m = 2 THEN y = y + Speed IF m = 3 THEN x = x - Speed IF m = 4 THEN x = x + Speed IF x > 625 - Speed THEN x = 15 + Speed IF x < 15 + Speed THEN x = 625 - Speed IF m <> 0 THEN LINE (oldx - 13, oldy - 13)-(oldx + 13, oldy + 13), 0, BF PUT (oldx - 13, oldy - 13), SnapShot GOSUB PointCheck IF POINT(x, y) = 5 THEN I$ = CHR$(27) GOTO YouWin END IF IF POINT(x, y) = 10 OR POINT(x, y - 4) = 10 OR POINT(x, y + 4) = 10 THEN cometstrike = 1 GOTO YouLose END IF GET (x - 13, y - 13)-(x + 13, y + 13), SnapShot GOSUB DrawShip END IF t = TIMER DO LOOP WHILE TIMER < t + .02 GOSUB UpdateBase IF gatetimer = 0 THEN gatetimer = TIMER IF TIMER > gatetimer + gatedelay THEN GOSUB DrawGates gatetimer = 0 END IF GOSUB UpdateComets fuel = fuel - 1 * (Speed + 1) IF fuel < 1 THEN FuelOut = 1 GOTO YouLose END IF IF gatecrash = 1 THEN GOTO YouLose GOSUB UpdateControlPanel LOOP WHILE I$ <> CHR$(27) ' * * * * * * * * ' You WIN ' * * * * * * * * YouWin: CLS level = level - 1 LOCATE 15, 25 PRINT "Press a key to go to the menu" DO I$ = INKEY$ LOOP WHILE I$ = "" CLS cycles = 1 GOSUB Splash GOTO Menu END ' * * * * * * * * * ' You Lose ' * * * * * * * * * YouLose: IF FuelOut = 1 THEN CLS LOCATE 10, 30 PRINT "You have run out of fuel" LOCATE 11, 35 PRINT "You Lose" END IF IF cometstrike = 1 THEN t = TIMER DO FOR j = 1 TO 25 STEP 2 K = K + 1 CIRCLE (x, y), j, K IF K > 15 THEN K = 0 NEXT j LOOP WHILE TIMER < t + 3 CLS LOCATE 10, 26 PRINT "You were struck by a comet" LOCATE 11, 35 PRINT "You Lose" END IF IF gatecrash = 1 THEN t = TIMER DO FOR j = 1 TO 25 STEP 2 K = K + 1 CIRCLE (x, y), j, K IF K > 15 THEN K = 0 NEXT j LOOP WHILE TIMER < t + 3 CLS LOCATE 10, 27 PRINT "You were crushed in a gate" LOCATE 11, 35 PRINT "You Lose" END IF LOCATE 15, 25 PRINT "Press a key to go to the menu" DO I$ = INKEY$ LOOP WHILE I$ = "" CLS cycles = 1 GOSUB Splash GOTO Menu '* * * * * * * * * ' Draw the Ship * '* * * * * * * * * DrawShip: IF m = 1 THEN GOSUB ShipUp IF m = 2 THEN GOSUB ShipDown IF m = 3 THEN GOSUB ShipLeft IF m = 4 THEN GOSUB ShipRight RETURN '* * * * * * * * * ' Erase the Ship * '* * * * * * * * * EraseShip: LINE (x - 13, y - 8)-(x + 13, y + 8), 0, BF RETURN ShipDown: LINE (x - 7, y + 6)-(x, y + 13), 14 LINE (x, y + 13)-(x + 7, y + 6), 14 LINE (x - 4, y + 8)-(x + 4, y + 8), 14 PAINT (x, y + 10), 14, 14 LINE (x - 5, y - 8)-(x + 5, y + 7), 9, BF LINE (x - 3, y - 9)-(x, y - 12), 12 LINE (x, y - 12)-(x + 3, y - 9), 12 LINE (x - 3, y - 9)-(x + 3, y - 9), 12 PAINT (x, y - 10), 12, 12 LINE (x - 1, y - 9)-(x, y - 10), 14 LINE (x, y - 10)-(x + 1, y - 9), 14 PSET (x, y - 9), 14 LINE (x - 6, y - 2)-(x - 9, y - 5), 6 LINE (x - 9, y - 5)-(x - 9, y - 10), 6 LINE (x - 9, y - 10)-(x - 6, y - 10), 6 LINE (x - 6, y - 10)-(x - 6, y - 2), 6 PAINT (x - 7, y - 5), 6, 6 LINE (x + 6, y - 2)-(x + 9, y - 5), 6 LINE (x + 9, y - 5)-(x + 9, y - 10), 6 LINE (x + 9, y - 10)-(x + 6, y - 10), 6 LINE (x + 6, y - 10)-(x + 6, y - 2), 6 PAINT (x + 7, y - 5), 6, 6 RETURN ShipUp: LINE (x + 7, y - 6)-(x, y - 13), 14 LINE (x, y - 13)-(x - 7, y - 6), 14 LINE (x + 4, y - 8)-(x - 4, y - 8), 14 PAINT (x, y - 10), 14, 14 LINE (x + 5, y + 8)-(x - 5, y - 7), 9, BF LINE (x + 3, y + 9)-(x, y + 12), 12 LINE (x, y + 12)-(x - 3, y + 9), 12 LINE (x + 3, y + 9)-(x - 3, y + 9), 12 PAINT (x, y + 10), 12, 12 LINE (x + 1, y + 9)-(x, y + 10), 14 LINE (x, y + 10)-(x - 1, y + 9), 14 PSET (x, y + 9), 14 LINE (x + 6, y + 2)-(x + 9, y + 5), 6 LINE (x + 9, y + 5)-(x + 9, y + 10), 6 LINE (x + 9, y + 10)-(x + 6, y + 10), 6 LINE (x + 6, y + 10)-(x + 6, y + 2), 6 PAINT (x + 7, y + 5), 6, 6 LINE (x - 6, y + 2)-(x - 9, y + 5), 6 LINE (x - 9, y + 5)-(x - 9, y + 10), 6 LINE (x - 9, y + 10)-(x - 6, y + 10), 6 LINE (x - 6, y + 10)-(x - 6, y + 2), 6 PAINT (x - 7, y + 5), 6, 6 RETURN ShipRight: LINE (x + 6, y + 7)-(x + 13, y), 14 LINE (x + 13, y)-(x + 6, y - 7), 14 LINE (x + 8, y - 4)-(x + 8, y + 4), 14 PAINT (x + 10, y), 14, 14 LINE (x - 8, y - 5)-(x + 7, y + 5), 9, BF LINE (x - 9, y + 3)-(x - 12, y), 12 LINE (x - 12, y)-(x - 9, y - 3), 12 LINE (x - 9, y - 3)-(x - 9, y + 3), 12 PAINT (x - 10, y), 12, 12 LINE (x - 9, y - 1)-(x - 10, y), 14 LINE (x - 10, y)-(x - 9, y + 1), 14 PSET (x - 9, y), 14 LINE (x - 2, y + 6)-(x - 5, y + 9), 6 LINE (x - 5, y + 9)-(x - 10, y + 9), 6 LINE (x - 10, y + 9)-(x - 10, y + 6), 6 LINE (x - 10, y + 6)-(x - 2, y + 6), 6 PAINT (x - 6, y + 7), 6, 6 LINE (x - 2, y - 6)-(x - 5, y - 9), 6 LINE (x - 5, y - 9)-(x - 10, y - 9), 6 LINE (x - 10, y - 9)-(x - 10, y - 6), 6 LINE (x - 10, y - 6)-(x - 2, y - 6), 6 PAINT (x - 7, y - 7), 6, 6 RETURN ShipLeft: LINE (x - 6, y - 7)-(x - 13, y), 14 LINE (x - 13, y)-(x - 6, y + 7), 14 LINE (x - 8, y + 4)-(x - 8, y - 4), 14 PAINT (x - 10, y), 14, 14 LINE (x + 8, y + 5)-(x - 7, y - 5), 9, BF LINE (x + 9, y - 3)-(x + 12, y), 12 LINE (x + 12, y)-(x + 9, y + 3), 12 LINE (x + 9, y + 3)-(x + 9, y - 3), 12 PAINT (x + 10, y), 12, 12 LINE (x + 9, y + 1)-(x + 10, y), 14 LINE (x + 10, y)-(x + 9, y - 1), 14 PSET (x + 9, y), 14 LINE (x + 2, y - 6)-(x + 5, y - 9), 6 LINE (x + 5, y - 9)-(x + 10, y - 9), 6 LINE (x + 10, y - 9)-(x + 10, y - 6), 6 LINE (x + 10, y - 6)-(x + 2, y - 6), 6 PAINT (x + 6, y - 7), 6, 6 LINE (x + 2, y + 6)-(x + 5, y + 9), 6 LINE (x + 5, y + 9)-(x + 10, y + 9), 6 LINE (x + 10, y + 9)-(x + 10, y + 6), 6 LINE (x + 10, y + 6)-(x + 2, y + 6), 6 PAINT (x + 7, y + 7), 6, 6 RETURN DrawMaze: FOR r = 1 TO 450 STEP 50 LINE (1, r)-(640, r + 8), 12, BF NEXT r LINE (1, 355)-(8, 400), 12, BF LINE (1, 355)-(8, 400), 12, BF LINE (632, 355)-(640, 400), 12, BF RETURN ' * * * * * * * * * * * ' DRAW GATES ' * * * * * * * * * * * DrawGates: ' Erase Gates z = 1 FOR r = 51 TO 400 STEP 50 gateloc = gates(z) IF gateloc = 1 THEN gatex = 60 IF gateloc = 2 THEN gatex = 300 IF gateloc = 3 THEN gatex = 480 z = z + 1 LINE (gatex, r)-(gatex + 40, r + 8), 12, BF ' Check for ship's y in a gate FOR jj = -13 TO 13 IF y + jj = r AND x - 13 >= gatex AND x + 13 <= gatex + 40 THEN gatecrash = 1 NEXT jj NEXT r ' Draw Gates z = 1 FOR r = 51 TO 400 STEP 50 gateloc = INT(3 * RND(1) + 1) IF gateloc = 1 THEN gatex = 60 IF gateloc = 2 THEN gatex = 300 IF gateloc = 3 THEN gatex = 480 gates(z) = gateloc z = z + 1 LINE (gatex, r)-(gatex + 40, r + 8), 0, BF NEXT r RETURN ' * * * * * * * * * ' POINT CHECK ' * * * * * * * * * PointCheck: IF POINT(x - 13, y - 13) = 12 OR POINT(x - 13, y + 13) = 12 THEN x = oldx: y = oldy: fuel = fuel - 10: SOUND 850, .3 END IF IF POINT(x + 13, y + 13) = 12 OR POINT(x + 13, y - 13) = 12 THEN x = oldx: y = oldy: fuel = fuel - 10: SOUND 850, .3 END IF IF POINT(x - 13, y) = 12 OR POINT(x + 13, y) = 12 THEN x = oldx: y = oldy: fuel = fuel - 10: SOUND 850, .3 END IF IF POINT(x - 13, y - 6) = 12 OR POINT(x + 13, y - 6) = 12 THEN x = oldx: y = oldy: fuel = fuel - 10: SOUND 850, .3 END IF IF POINT(x - 13, y + 6) = 12 OR POINT(x + 13, y + 6) = 12 THEN x = oldx: y = oldy: fuel = fuel - 10: SOUND 850, .3 END IF RETURN ' * * * * * * * * * ' UPDATE BASE ' * * * * * * * * * UpdateBase: LINE (basex - 11, 381 - 11)-(basex + 11, 381 + 11), 0, BF PUT (basex - 11, 381 - 11), baseshot IF BaseMove = 0 THEN basex = basex - 1 IF basex < 30 THEN BaseMove = 1 END IF IF BaseMove = 1 THEN basex = basex + 1 IF basex > 610 THEN BaseMove = 0 END IF GET (basex - 11, 381 - 11)-(basex + 11, 381 + 11), baseshot CIRCLE (basex, 381), 10, 14 PAINT (basex, 381), 5, 14 RETURN UpdateComets: ' Erase the Comets FOR I = 1 TO 6 LINE (cometx(I) - 7, comety(I) - 7)-(cometx(I) + 7, comety(I) + 7), 0, BF NEXT I ' Put Stars Back Up PUT (cometx(1) - 7, comety(1) - 7), c1 PUT (cometx(2) - 7, comety(2) - 7), c2 PUT (cometx(3) - 7, comety(3) - 7), c3 PUT (cometx(4) - 7, comety(4) - 7), c4 PUT (cometx(5) - 7, comety(5) - 7), c4 PUT (cometx(6) - 7, comety(6) - 7), c4 ' Change the x values for the comets FOR I = 1 TO 6 cometx(I) = cometx(I) - 1 IF cometx(I) < 15 THEN cometx(I) = 620 NEXT I 'Get new snapshots GET (cometx(1) - 7, comety(1) - 7)-(cometx(1) + 7, comety(1) + 7), c1 GET (cometx(2) - 7, comety(2) - 7)-(cometx(2) + 7, comety(2) + 7), c2 GET (cometx(3) - 7, comety(3) - 7)-(cometx(3) + 7, comety(3) + 7), c3 GET (cometx(4) - 7, comety(4) - 7)-(cometx(4) + 7, comety(4) + 7), c4 GET (cometx(5) - 7, comety(5) - 7)-(cometx(5) + 7, comety(5) + 7), c5 GET (cometx(6) - 7, comety(6) - 7)-(cometx(6) + 7, comety(6) + 7), c6 ' Redraw the comets FOR I = 1 TO 6 CIRCLE (cometx(I), comety(I)), 6, 2 PAINT (cometx(I), comety(I)), 10, 2 NEXT I RETURN UpdateControlPanel: LOCATE 28, 10: PRINT "Speed=Warp "; Speed LOCATE 28, 30: PRINT "Seconds until gate change="; gatedelay - INT(TIMER - gatetimer); " " gatecounter = gatedelay - INT(TIMER - gatetimer) IF gatecounter < 4 AND gatealarm = 0 THEN SOUND 1200, .2 gatealarm = 1: B = gatecounter END IF IF B <> gatecounter AND gatealarm = 1 THEN gatealarm = 0 LOCATE 29, 10: PRINT "Fuel="; fuel; RETURN Splash: FOR r = 1 TO 250 STEP 50 LINE (1, r)-(640, r + 8), 12, BF NEXT r FOR SS = 1 TO cycles ' Erase Gates z = 1 FOR r = 51 TO 250 STEP 50 gateloc = gates(z) IF gateloc = 1 THEN gatex = 60 IF gateloc = 2 THEN gatex = 300 IF gateloc = 3 THEN gatex = 480 z = z + 1 LINE (gatex, r)-(gatex + 40, r + 8), 12, BF SOUND 400, .05 SOUND 800, .05 SOUND 1200, .05 NEXT r ' Draw Gates z = 1 FOR r = 51 TO 250 STEP 50 gateloc = INT(3 * RND(1) + 1) IF gateloc = 1 THEN gatex = 60 IF gateloc = 2 THEN gatex = 300 IF gateloc = 3 THEN gatex = 480 gates(z) = gateloc z = z + 1 LINE (gatex, r)-(gatex + 40, r + 8), 0, BF NEXT r t = TIMER DO LOOP WHILE TIMER < t + .3 NEXT SS IF cycles <> 1 THEN y = 26 FOR j = 20 TO 422 STEP 4 x = j GOSUB ShipRight x = 620 - j GOSUB ShipLeft ttt = TIMER DO LOOP WHILE TIMER < ttt + .01 x = j LINE (x - 13, y - 13)-(x + 13, y + 13), 0, BF x = 620 - j LINE (x - 13, y - 13)-(x + 14, y + 13), 0, BF NEXT j x = j GOSUB ShipRight x = 620 - j GOSUB ShipLeft END IF IF cycles = 1 THEN x = 422: y = 26 GOSUB ShipRight x = 200 GOSUB ShipLeft END IF RETURN RETURN Instructions: COLOR 0 FOR r = 15 TO 29 FOR c = 5 TO 75 LOCATE r, c PRINT CHR$(219); NEXT c NEXT r COLOR 14 LOCATE 15, 10 PRINT "The object of the game is to move the spaceship through the maze" LOCATE 16, 10 PRINT "from the top row to the bottom where where you have to dock with" LOCATE 17, 10 PRINT "your base." LOCATE 19, 10 PRINT "You can control your speed by pressing 1, 2 , or 3 keys. " LOCATE 20, 10 PRINT "Space bar pauses the ship. Change direction with the arrow keys." LOCATE 22, 10 PRINT "You will die if:" LOCATE 23, 20 PRINT "you run out of fuel" LOCATE 24, 20 PRINT "get caught in a gate when it closes" LOCATE 25, 20 PRINT "collide with a comet" LOCATE 27, 10 PRINT "Successful completion of a mission advances you to the next" LOCATE 28, 10 PRINT "level where the time between gate changes decreases." COLOR 13 LOCATE 29, 28 PRINT "Press a key to continue"; DO I$ = INKEY$ LOOP WHILE I$ = "" COLOR 15 CLS cycles = 1 GOSUB Splash GOTO Menu