DECLARE SUB instructions (page!) DECLARE SUB DrawPage (PageNo!) DECLARE SUB About () DECLARE SUB ResetGame () DECLARE SUB NewScoreC (NUMBER!) DECLARE SUB Expired () DECLARE SUB ExCheckSav (DateYear!, DateMonth!, DateDay!, DateHour!, Days!, Hours!, EVALPERIOD!) DECLARE SUB GetInfo () DECLARE SUB DrawCustomLev (X!, Y!, AX!, AY!, SPD!, CNTRS!) DECLARE SUB SlotChoose (slot!, L$) DECLARE SUB Load (speedlevel!, StartposX!, Startposy!, Direction$, Counters!) DECLARE SUB Save (speedlevel!, StartposX!, Startposy!, Direction$, Counters!) DECLARE SUB Modify (SPD!, SPOSX!, SPOSY!, Sdir$, CNTRS!) DECLARE SUB help () DECLARE SUB MoveCursor (DrawCol!, X!, Y!, Direction$, ColorPixel!) DECLARE SUB LevelEdit () DECLARE SUB NotComplete () DECLARE SUB LastLevel () DECLARE SUB HighScores () DECLARE SUB InitScrMode () DECLARE SUB NewScore () DECLARE SUB AwaitKey () DECLARE SUB pause (UNITS!) DECLARE SUB Choose (POSI!) DECLARE SUB DrawLevel (POSX!, POSY!, MOVEX!, MOVEY!) DECLARE SUB ClsScreen () DECLARE SUB ScoreMode () DECLARE SUB LevelMode (X!, Y!, AX!, AY!) DECLARE SUB CustomMode (X!, Y!, AX!, AY!, SPD!, CNTRS!) DECLARE SUB CutScene () DECLARE SUB LevSel () DECLARE SUB Menu (O1$, O2$, O3$, O4$, O5$, sel!) DECLARE SUB Options () DECLARE SUB InitLevMode () DECLARE SUB InitCustomMode () SCREEN 9 DIM SHARED X(1 TO 1985) DIM SHARED Y(1 TO 1985) DIM SHARED N$(1 TO 10) DIM SHARED S(1 TO 10) DIM SHARED SCORE, LEVEL, MAXLEV, SPEED, SPDLEV, COMPLETE$ CALL GetInfo LOCATE 11, 26: PRINT "CALCULATING SPEED OF PROCESSOR" LOCATE 13, 34: PRINT "PLEASE WAIT..." t = TIMER FOR counter = 1 TO 200 LINE (0, 0)-(9, 9), 0, BF FOR counter1 = 1 TO 2000: NEXT counter1 NEXT TIME = TIMER - t SPEED = 6500 / (TIME + 1D-99) RANDOMIZE TIMER IF MAXLEV >= 2 AND MAXLEV <= 14 THEN LEVEL = MAXLEV ELSE LEVEL = 0 DO CALL Menu("Play", "High Scores", "Options", "About Snake", "Exit", sel) SELECT CASE sel CASE IS = 1: IF LEVEL >= 16 AND LEVEL <= 25 THEN CALL InitCustomMode IF LEVEL = 15 THEN CALL CutScene IF LEVEL >= 1 AND LEVEL <= 14 THEN CALL InitLevMode IF LEVEL = 0 THEN CALL InitScrMode CASE IS = 2: CALL HighScores CASE IS = 3: CALL Options CASE IS = 4: CALL About CASE IS = 5: EXIT DO END SELECT LOOP OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 IF MAXLEV >= 10 THEN MAXLEV$ = MID$(STR$(MAXLEV), 2, 2) ELSE MAXLEV$ = "0" + MID$(STR$(MAXLEV), 2, 1) FOR COUNT = 1 TO 10 IF S(COUNT) < 10 THEN S$(COUNT) = "00000" + MID$(STR$(S(COUNT)), 2, 1) IF S(COUNT) >= 10 THEN S$(COUNT) = "0000" + MID$(STR$(S(COUNT)), 2, 2) IF S(COUNT) >= 100 THEN S$(COUNT) = "000" + MID$(STR$(S(COUNT)), 2, 3) IF S(COUNT) >= 1000 THEN S$(COUNT) = "00" + MID$(STR$(S(COUNT)), 2, 4) IF S(COUNT) >= 10000 THEN S$(COUNT) = "0" + MID$(STR$(S(COUNT)), 2, 5) IF S(COUNT) >= 100000 THEN S$(COUNT) = MID$(STR$(S(COUNT)), 2, 6) NEXT COUNT DATA$ = MAXLEV$ FOR COUNT = 1 TO 10 DATA$ = DATA$ + N$(COUNT) NEXT COUNT FOR COUNT = 1 TO 10 DATA$ = DATA$ + S$(COUNT) NEXT COUNT FOR COUNT = 1 TO 242 BYTE$ = CHR$(ASC(MID$(DATA$, COUNT, 1)) - 30) PUT #1, COUNT, BYTE$ NEXT COUNT CLOSE #1 END SUB About PALETTE 9, 0 COLOR 14, 1 CLS LOCATE 9, 20: PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" FOR Y = 10 TO 17 LOCATE Y, 20: PRINT "³ ³" NEXT Y LOCATE 18, 20: PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ" PAINT (1, 1), 9, 14 LOCATE 10, 35: PRINT "<<< SNAKE >>>" LOCATE 11, 35: PRINT " " LOCATE 12, 29: PRINT "Created by: Conrad Rider" LOCATE 14, 25: PRINT "Conrad@Scottrider.freeserve.co.uk" LOCATE 16, 27: PRINT "This program has no copyright." LOCATE 17, 32: PRINT "Distribute freely!" t = TIMER DO SELECT CASE INKEY$ CASE CHR$(13): EXIT DO CASE CHR$(27): END END SELECT LOOP UNTIL TIMER - t > 20 PALETTE END SUB SUB AwaitKey t = TIMER EXT = 0 DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "P", CHR$(0) + "H", CHR$(0) + "M", CHR$(0) + "K", "": EXT = 0 CASE CHR$(27): END CASE CHR$(32) LOCATE 1, 1: PRINT " <<< PAUSED >>> " DO: SELECT CASE INKEY$ CASE IS = CHR$(27): END CASE IS = CHR$(32): EXIT DO END SELECT: LOOP LOCATE 1, 33: PRINT " " EXT = 1 CASE ELSE: EXT = 1 END SELECT LOOP UNTIL TIMER - t > 2 OR EXT = 1 END SUB SUB Choose (POSI) FOR counter = 1 TO 10: WASTE$ = INKEY$: NEXT counter LOCATE 1, 1: PRINT " <<< CONTINUE >>>   BACK TO MENU " DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 DO SELECT CASE INKEY$ CASE CHR$(0) + "K": LOCATE 1, 12: PRINT "<<< CONTINUE >>>": LOCATE 1, 52: PRINT " BACK TO MENU ": DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 CASE CHR$(0) + "M": LOCATE 1, 52: PRINT "<<< BACK TO MENU >>>": LOCATE 1, 12: PRINT " CONTINUE ": DRAW "BM 308,7 P4,0 BM331,7 P10,0": POSI = 1 CASE CHR$(13): EXIT DO CASE CHR$(27): END END SELECT LOOP END SUB SUB ClsScreen LINE (0, 14)-(640, 350), 12, BF LINE (10, 21)-(629, 340), 1, BF LOCATE 1, 1: PRINT " " END SUB SUB CustomMode (X, Y, AX, AY, SPD, CNTRS) DO DED = 0 DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 31) + 3) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 LINE (CX, CY)-(CX + 9, CY + 9), 10, BF LOCATE 1, 1: PRINT "COUNTERS: 0 CUSTOM LEVEL: " LOCATE 1, 29: PRINT LEVEL - 16 Counters = 0 LENGTH = 3 FOR c = 3 TO 1985 X(c) = 0: Y(c) = 0 NEXT c DO CALL pause(SPD) SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": IF AY = 0 THEN AY = 10: AX = 0 CASE IS = CHR$(0) + "H": IF AY = 0 THEN AY = -10: AX = 0 CASE IS = CHR$(0) + "M": IF AX = 0 THEN AX = 10: AY = 0 CASE IS = CHR$(0) + "K": IF AX = 0 THEN AX = -10: AY = 0 CASE IS = CHR$(13): DED = 1: EXIT DO CASE IS = CHR$(32): PLAY "O5 L30 C" t = TIMER LOCATE 1, 33: PRINT "<<< PAUSED >>>" DO: SELECT CASE INKEY$ CASE IS = CHR$(27): END CASE IS = CHR$(32): EXIT DO END SELECT: LOOP LOCATE 1, 33: PRINT " " Btime = Btime + (TIMER - t) PLAY "O5 L30 C" CASE IS = CHR$(27): END END SELECT X = X + AX Y = Y + AY IF POINT(X + 5, Y + 5) = 10 THEN PLAY "O4L20G" Counters = Counters + 1 LOCATE 1, 1: PRINT "COUNTERS:"; Counters IF Counters < CNTRS THEN LENGTH = LENGTH + 10 DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 32) + 2) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 AND (CX <> X(LENGTH) AND CY <> Y(LENGTH)) LINE (CX, CY)-(CX + 9, CY + 9), 10, BF ELSE LOCATE 1, 1: PRINT " <<< LEVEL COMPLETE >>> " CALL AwaitKey EXIT DO END IF END IF IF POINT(X + 5, Y + 5) = 12 OR POINT(X + 5, Y + 5) = 14 THEN PLAY "O0L10G" LOCATE 1, 32: PRINT "<<< YOU DIED! >>>" CALL AwaitKey DED = 1 EXIT DO ELSE LINE (X, Y)-(X + 9, Y + 9), 14, BF FOR c = LENGTH TO 2 STEP -1 X(c) = X(c - 1) Y(c) = Y(c - 1) NEXT X(1) = X: Y(1) = Y IF POINT(X(LENGTH), Y(LENGTH)) = 14 THEN LINE (X(LENGTH), Y(LENGTH))-(X(LENGTH) + 9, Y(LENGTH) + 9), 1, BF END IF END IF LOOP IF DED = 1 THEN CALL DrawCustomLev(X, Y, AX, AY, SPD, CNTRS) CALL Choose(CHOICE) END IF LOOP UNTIL CHOICE = 1 OR DED = 0 END SUB SUB CutScene LINE (0, 0)-(640, 350), 1, BF inc = 1 X = 100 Y = 100 efor = 0 ChangeX = 5: ChangeY = 3 FOR add = 1 TO 13 STEP .5 FOR c = 10 * (add - .5) TO 10 * add X = X + .7 Y = Y + .7 inc = inc * 1.01 CIRCLE (X, Y), c * inc, 12, , , 5 / 7.6 NEXT c NEXT add PALETTE 1, 32 PALETTE 12, 20 PAINT (103, 103), 14, 12 t = TIMER DO: LOOP UNTIL TIMER - t > 1 inc = 1 X = 100 Y = 100 efor = 0 M = 10000 ChangeX = 5: ChangeY = 3 FOR add = 1 TO 7 STEP .5 FOR c = 10 * (add - .5) TO 10 * add M = M / 1.1 X = X + .7 Y = Y + .7 FOR P = 1 TO M: NEXT inc = inc * 1.01 IF alternate = 1 THEN alternate = 0 CIRCLE (X, Y), c * inc, 8, , , 5 / 7.6 PAINT (X + (c * inc - 1), Y), 14, 8 ELSE alternate = 1 CIRCLE (X, Y), c * inc, 7, , , 5 / 7.6 PAINT (X + (c * inc - 1), Y), 14, 7 END IF NEXT c NEXT add PALETTE 8, 0 CIRCLE (155, 170), 100, 8, 3.8, 5.65, 1 / 2 CIRCLE (155, 170), 120, 8, 3.97, 5.41, 1 / 3 PAINT (155, 215), 8, 8 CIRCLE (100, 140), 30, 8, , , 1 CIRCLE (210, 140), 30, 8, , , 1 PAINT (100, 140), 8, 8 PAINT (210, 140), 8, 8 CIRCLE (101, 145), 10, 15 CIRCLE (211, 145), 10, 15 PAINT (101, 145), 15, 15 PAINT (211, 145), 15, 15 COLOR 8, 63 DRAW "BM290,220 C15 M360,215 R225 F5 D104 G5 L235 H5 U100 M290,220 BR4 P15,15" LOCATE 17, 52: PRINT "Congratulations," LOCATE 18, 49: PRINT "You have completed all" LOCATE 19, 48: PRINT "the levels in this game." LOCATE 20, 46: PRINT "Now you can start designing" LOCATE 21, 49: PRINT "levels of your own!" LOCATE 23, 53: PRINT "Press ENTER." t = TIMER SECTION = 0 DO: SECTION = SECTION + 1 SELECT CASE SECTION CASE IS = 1: PLAY "P8" CASE IS = 2: PLAY "L8O5D" CASE IS = 3: PLAY "L16C" CASE IS = 4: PLAY "L8O4B" CASE IS = 5: PLAY "L16O5C" CASE IS = 6: PLAY "L8D P4" CASE IS = 7: PLAY "L16B P8" CASE IS = 8: PLAY "L4G P8" CASE IS = 9: PLAY "L8O5D" CASE IS = 10: PLAY "L16C" CASE IS = 11: PLAY "L8O4B" CASE IS = 12: PLAY "L16O5C" CASE IS = 13: PLAY "L8D P4" CASE IS = 14: PLAY "L16DEDC" CASE IS = 15: PLAY "P16 O4B" CASE IS = 16: PLAY "L4A" CASE IS = 17: PLAY "P8" CASE IS = 18: PLAY "L8O5D" CASE IS = 19: PLAY "L16C" CASE IS = 20: PLAY "L8O4B" CASE IS = 21: PLAY "L16O5C" CASE IS = 22: PLAY "L8D P4" CASE IS = 23: PLAY "L16B P8" CASE IS = 24: PLAY "L4G P8" CASE IS = 25: PLAY "L8O5D" CASE IS = 26: PLAY "L16C" CASE IS = 27: PLAY "L8O4B" CASE IS = 28: PLAY "L16O5C" CASE IS = 29: PLAY "L8D P4" CASE IS = 30: PLAY "O4 L16 B" CASE IS = 31: PLAY "P8 L4 G" END SELECT SELECT CASE INKEY$ CASE CHR$(27): END CASE CHR$(13): EXIT DO END SELECT LOOP UNTIL TIMER - t > 11.5 PALETTE COLOR 15, 0 LEVEL = 16 END SUB SUB DrawCustomLev (X, Y, AX, AY, SPD, CNTRS) COLOR 15, 0 CALL ClsScreen OPEN "C:LEVELS.DAT" FOR BINARY AS #1 savedd$ = " ": GET #1, LEVEL - 15, savedd$ IF savedd$ = "U" THEN SEEK #1, (LEVEL - 16) * 1989 + 11 Char$ = " " GET #1, , Char$: SPD = ASC(Char$) GET #1, , Char$: StartposX = ASC(Char$) GET #1, , Char$: Startposy = ASC(Char$) GET #1, , Char$: Direction$ = Char$ GET #1, , Char$: CNTRS = ASC(Char$) DIM LEVEL$(1 TO 62, 1 TO 32) FOR Y = 1 TO 32 FOR X = 1 TO 62 GET #1, , Char$: LEVEL$(X, Y) = Char$ NEXT X NEXT Y FOR Y = 1 TO 32 FOR X = 1 TO 62 ColourPixel = ASC(LEVEL$(X, Y)) - 32 LINE (10 * X, 10 * Y + 11)-(10 * X + 9, 10 * Y + 20), ColourPixel, BF NEXT X NEXT Y X = StartposX * 10 Y = Startposy * 10 + 11 SELECT CASE Direction$ CASE IS = "U": AX = 0: AY = -10 CASE IS = "D": AX = 0: AY = 10 CASE IS = "L": AX = -10: AY = 0 CASE IS = "R": AX = 10: AY = 0 END SELECT ELSE X = 300 Y = 171 AX = 10 AY = 0 SPD = 5 CNTRS = 10 END IF CLOSE #1 END SUB SUB DrawLevel (POSX, POSY, MOVEX, MOVEY) 'LINE (320, 181)-(329, 190), 12, BF SELECT CASE LEVEL '------------------------------------------------ CASE 1 LINE (100, 181)-(549, 190), 12, BF SPDLEV = 5 POSX = 0: POSY = 91: MOVEX = 10: MOVEY = 0 '------------------------------------------------ CASE 2 LINE (100, 181)-(549, 190), 12, BF LINE (90, 101)-(99, 270), 12, BF LINE (550, 101)-(559, 270), 12, BF POSX = 0: POSY = 51: MOVEX = 10: MOVEY = 0 SPDLEV = 5 '------------------------------------------------ CASE 3 Y = 281 FOR X = 120 TO 520 STEP 20 LINE (X, Y)-(X + 19, Y + 9), 12, BF Y = Y - 10 NEXT X Y = 281 FOR X = 520 TO 120 STEP -20 LINE (X, Y)-(X + 19, Y + 9), 12, BF Y = Y - 10 NEXT X LINE (300, 171)-(359, 200), 12, BF POSX = 0: POSY = 41: MOVEX = 10: MOVEY = 0 SPDLEV = 5 '------------------------------------------------ CASE 4 LINE (40, 51)-(49, 110), 12, BF LINE (40, 251)-(49, 310), 12, BF LINE (280, 51)-(289, 150), 12, BF LINE (280, 211)-(289, 310), 12, BF LINE (360, 51)-(369, 150), 12, BF LINE (360, 211)-(369, 310), 12, BF LINE (590, 51)-(599, 110), 12, BF LINE (590, 251)-(599, 310), 12, BF LINE (40, 51)-(249, 60), 12, BF LINE (40, 141)-(279, 150), 12, BF LINE (40, 211)-(279, 220), 12, BF LINE (40, 301)-(249, 310), 12, BF LINE (400, 51)-(599, 60), 12, BF LINE (360, 141)-(599, 150), 12, BF LINE (360, 211)-(599, 220), 12, BF LINE (400, 301)-(599, 310), 12, BF POSX = 0: POSY = 31: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 5 FOR Y = 30 TO 310 STEP 40 FOR X = 30 TO 590 STEP 40 LINE (X, Y + 1)-(X + 19, Y + 20), 12, BF NEXT X NEXT Y POSX = 0: POSY = 21: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 6 LINE (60, 21)-(69, 230), 12, BF LINE (10, 281)-(519, 290), 12, BF LINE (570, 131)-(579, 340), 12, BF LINE (120, 71)-(629, 80), 12, BF LINE (70, 221)-(459, 230), 12, BF LINE (510, 221)-(519, 290), 12, BF LINE (180, 131)-(569, 140), 12, BF LINE (120, 81)-(129, 140), 12, BF LINE (120, 171)-(519, 190), 12, BF POSX = 60: POSY = 151: MOVEX = 10: MOVEY = 0 SPDLEV = 4 '------------------------------------------------ CASE 7 Y = 281 FOR X = 120 TO 520 STEP 20 LINE (X, Y)-(X + 19, Y + 9), 12, BF Y = Y - 10 NEXT X Y = 281 FOR X = 520 TO 120 STEP -20 LINE (X, Y)-(X + 19, Y + 9), 12, BF Y = Y - 10 NEXT X LINE (300, 171)-(359, 200), 12, BF LINE (10, 181)-(259, 190), 12, BF LINE (400, 181)-(629, 190), 12, BF LINE (320, 21)-(339, 140), 12, BF LINE (320, 231)-(339, 340), 12, BF POSX = 0: POSY = 41: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 8 LINE (10, 101)-(229, 110), 12, BF LINE (10, 251)-(329, 260), 12, BF LINE (50, 151)-(59, 210), 12, BF LINE (50, 151)-(229, 160), 12, BF LINE (50, 201)-(329, 210), 12, BF LINE (240, 21)-(249, 190), 12, BF LINE (240, 271)-(249, 340), 12, BF LINE (290, 61)-(299, 190), 12, BF LINE (290, 271)-(299, 300), 12, BF LINE (290, 61)-(349, 70), 12, BF LINE (310, 101)-(629, 110), 12, BF LINE (310, 151)-(589, 160), 12, BF LINE (290, 291)-(349, 300), 12, BF LINE (340, 61)-(349, 90), 12, BF LINE (340, 171)-(349, 300), 12, BF LINE (390, 21)-(399, 90), 12, BF LINE (390, 171)-(399, 340), 12, BF LINE (410, 201)-(589, 210), 12, BF LINE (410, 251)-(629, 260), 12, BF LINE (580, 151)-(589, 210), 12, BF POSX = 0: POSY = 51: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 9 LINE (30, 71)-(39, 150), 12, BF '1 LINE (30, 211)-(39, 290), 12, BF '2 LINE (60, 71)-(69, 120), 12, BF '3 LINE (60, 241)-(69, 290), 12, BF '4 LINE (60, 41)-(289, 50), 12, BF '5 LINE (60, 71)-(259, 80), 12, BF '6 LINE (80, 91)-(259, 100), 12, BF '7 LINE (60, 111)-(259, 120), 12, BF '8 LINE (30, 141)-(289, 150), 12, BF '9 LINE (10, 171)-(289, 190), 12, BF '10 LINE (30, 211)-(289, 220), 12, BF '11 LINE (60, 241)-(259, 250), 12, BF '12 LINE (80, 261)-(259, 270), 12, BF '13 LINE (60, 281)-(259, 290), 12, BF '14 LINE (60, 311)-(289, 320), 12, BF '15 LINE (280, 41)-(289, 150), 12, BF '16 LINE (280, 211)-(289, 320), 12, BF '17 LINE (310, 21)-(329, 150), 12, BF '18 LINE (310, 211)-(329, 340), 12, BF '19 LINE (350, 41)-(359, 150), 12, BF '20 LINE (350, 211)-(359, 320), 12, BF '21 LINE (350, 41)-(579, 50), 12, BF '22 LINE (380, 71)-(579, 80), 12, BF '23 LINE (380, 91)-(559, 100), 12, BF '24 LINE (380, 111)-(579, 120), 12, BF '25 LINE (350, 141)-(609, 150), 12, BF '26 LINE (350, 171)-(629, 190), 12, BF '27 LINE (350, 211)-(609, 220), 12, BF '28 LINE (380, 241)-(579, 250), 12, BF '29 LINE (380, 261)-(559, 270), 12, BF '30 LINE (380, 281)-(579, 290), 12, BF '31 LINE (350, 311)-(579, 320), 12, BF '32 LINE (570, 71)-(579, 120), 12, BF '33 LINE (570, 241)-(579, 290), 12, BF '34 LINE (600, 71)-(609, 150), 12, BF '35 LINE (600, 211)-(609, 290), 12, BF '36 POSX = 0: POSY = 21: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 10 Y = 161 FOR X = 60 TO 230 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X Y = 41 FOR X = 30 TO 270 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X Y = 71 FOR X = 160 TO 420 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X Y = 21 FOR X = 210 TO 470 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X Y = 71 FOR X = 360 TO 600 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X Y = 21 FOR X = 400 TO 570 STEP 10 LINE (X, Y)-(X + 9, Y + 9), 12, BF Y = Y + 10 NEXT X LINE (220, 331)-(229, 340), 12, BF LINE (10, 21)-(29, 40), 12, BF LINE (410, 331)-(419, 340), 12, BF LINE (220, 21)-(229, 30), 12, BF LINE (610, 321)-(629, 340), 12, BF LINE (410, 21)-(419, 30), 12, BF POSX = 30: POSY = 41: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 11 FOR Y = 30 TO 310 STEP 20 FOR X = 20 TO 610 STEP 20 LINE (X, Y + 1)-(X + 9, Y + 10), 12, BF NEXT X NEXT Y LINE (10, 331)-(629, 340), 12, BF LINE (620, 21)-(629, 340), 12, BF POSX = 0: POSY = 21: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 12 LINE (130, 21)-(139, 340), 12, BF LINE (250, 21)-(259, 340), 12, BF LINE (380, 21)-(389, 340), 12, BF LINE (500, 21)-(509, 340), 12, BF LINE (10, 91)-(629, 100), 12, BF LINE (10, 171)-(629, 180), 12, BF LINE (10, 251)-(629, 260), 12, BF LINE (70, 91)-(89, 100), 1, BF '1 LINE (70, 251)-(89, 260), 1, BF '2 LINE (130, 51)-(139, 70), 1, BF '3 LINE (130, 291)-(139, 310), 1, BF '4 LINE (180, 91)-(199, 100), 1, BF '5 LINE (180, 171)-(199, 180), 1, BF '6 LINE (250, 131)-(259, 150), 1, BF '7 LINE (250, 291)-(259, 310), 1, BF '8 LINE (310, 91)-(329, 100), 1, BF '9 LINE (310, 251)-(329, 260), 1, BF '10 LINE (380, 51)-(389, 70), 1, BF '11 LINE (380, 131)-(389, 150), 1, BF '12 LINE (440, 91)-(459, 100), 1, BF '13 LINE (440, 171)-(459, 180), 1, BF '14 LINE (440, 251)-(459, 260), 1, BF '15 LINE (500, 51)-(509, 70), 1, BF '16 LINE (500, 211)-(509, 230), 1, BF '17 LINE (560, 91)-(579, 100), 1, BF '18 LINE (560, 251)-(579, 260), 1, BF '19 LINE (130, 211)-(139, 230), 1, BF '20 POSX = 0: POSY = 51: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 13 LINE (50, 41)-(59, 320), 12, BF '1 LINE (80, 71)-(89, 290), 12, BF '2 LINE (70, 41)-(179, 50), 12, BF '3 LINE (100, 71)-(169, 80), 12, BF '4 LINE (100, 281)-(169, 290), 12, BF '5 LINE (70, 311)-(179, 320), 12, BF '6 LINE (180, 91)-(189, 270), 12, BF '32 LINE (210, 81)-(219, 280), 12, BF '7 LINE (260, 41)-(269, 80), 12, BF '8 LINE (260, 281)-(269, 320), 12, BF '9 LINE (300, 71)-(309, 290), 12, BF '10 LINE (280, 41)-(379, 50), 12, BF '11 LINE (260, 71)-(309, 80), 12, BF '12 LINE (260, 281)-(309, 290), 12, BF '13 LINE (260, 311)-(359, 320), 12, BF '14 LINE (330, 71)-(379, 80), 12, BF '15 LINE (330, 281)-(379, 290), 12, BF '16 LINE (330, 71)-(339, 290), 12, BF '17 LINE (370, 41)-(379, 80), 12, BF '18 LINE (370, 281)-(379, 320), 12, BF '19 LINE (420, 41)-(429, 320), 12, BF '20 LINE (450, 71)-(459, 170), 12, BF '21 LINE (450, 191)-(459, 290), 12, BF '22 LINE (580, 41)-(589, 80), 12, BF '23 LINE (520, 161)-(529, 200), 12, BF '24 LINE (580, 281)-(589, 320), 12, BF '25 LINE (440, 41)-(589, 50), 12, BF '26 LINE (450, 71)-(589, 80), 12, BF '27 LINE (450, 161)-(529, 170), 12, BF '28 LINE (450, 191)-(529, 200), 12, BF '29 LINE (450, 281)-(589, 290), 12, BF '30 LINE (440, 311)-(589, 320), 12, BF '31 LINE (170, 81)-(179, 90), 12, BF LINE (170, 271)-(179, 280), 12, BF LINE (180, 51)-(189, 60), 12, BF '1 LINE (190, 61)-(199, 70), 12, BF '2 LINE (200, 71)-(209, 80), 12, BF '3 LINE (200, 281)-(209, 290), 12, BF '1 LINE (190, 291)-(199, 300), 12, BF '2 LINE (180, 301)-(189, 310), 12, BF '3 POSX = 0: POSY = 21: MOVEX = 10: MOVEY = 0 SPDLEV = 7 '------------------------------------------------ CASE 14 X1 = 20 Y1 = 31 X2 = 619 Y2 = 320 c = 12 FOR TA = 0 TO 140 STEP 10 LINE (X1 + TA, Y1 + TA)-(X2 - TA, Y2 - TA), c, BF IF c = 12 THEN c = 1 ELSE c = 12 NEXT TA X = 10 FOR Y = 30 TO 170 STEP 20 LINE (X, Y + 1)-(X + 9, Y + 10), 12, BF LINE (X + 10, Y + 11)-(X + 19, Y + 20), 1, BF X = X + 20 NEXT Y LINE (10, 331)-(629, 340), 12, BF LINE (0, 341)-(639, 350), 0, BF '------------------------------------------------ CASE 15 '------------------------------------------------ END SELECT END SUB SUB DrawPage (PageNo) FOR Y = 3 TO 20 LOCATE Y, 2: PRINT " " NEXT Y COLOR 10 LOCATE 22, 4: PRINT " PREVIOUS": LOCATE 22, 70: PRINT "NEXT " COLOR 14 SELECT CASE PageNo CASE 1 LOCATE 3, 33: PRINT "<<< CONTROLS >>>" LOCATE 4, 33: PRINT " " LOCATE 5, 3: PRINT "" LOCATE 6, 2: PRINT "þ General: þ Level Editor:" COLOR 12 LOCATE 7, 3: PRINT " ESC = EXIT PROGRAM SPACE = DRAW ON" LOCATE 8, 3: PRINT " LEFT/RIGHT = MODIFY / CHOOSE OPTION BACK SPACE = ERASE ON" LOCATE 9, 3: PRINT " ENTER = DRAW OFF / ERASE OFF" COLOR 14: LOCATE 10, 2: PRINT "þ Menu:": COLOR 12: LOCATE 10, 43: PRINT "INSERT = DRAW PIXEL" LOCATE 11, 3: PRINT " UP/DOWN = BROWSE DELETE = ERASE PIXEL" LOCATE 12, 3: PRINT " ENTER = SELECT HOME = SET AS STARTING POSITION" LOCATE 13, 3: PRINT " F10 = NEW LEVEL" COLOR 14: LOCATE 14, 2: PRINT "þ Game:": COLOR 12: LOCATE 14, 43: PRINT "F2 = SAVE LEVEL" LOCATE 15, 3: PRINT " ARROW KEYS = CHANGE DIRECTION F3 = LOAD LEVEL" LOCATE 16, 3: PRINT " SPACE = PAUSE/UNPAUSE F4 = MODIFY LEVEL SETTINGS" LOCATE 17, 3: PRINT " ENTER = RE-START F5 = EXIT LEVEL EDITOR" LOCATE 18, 3: PRINT " F1 = HELP" LOCATE 19, 3: PRINT "" LOCATE 22, 4: PRINT " " COLOR 14 CASE 2 LOCATE 3, 36: PRINT "<<< AIM >>>" LOCATE 4, 36: PRINT " " COLOR 7 LOCATE 5, 2: PRINT "The aim of Snake, is to collect green counters without going into the walls or" LOCATE 6, 2: PRINT "your tail. As you collect counters your tail grows longer. You can play in one" LOCATE 7, 2: PRINT "of two modes: Score Mode or Level Mode. To choose the mode you want to play in" LOCATE 8, 2: PRINT "select Level from the options menu. Use the Left/Right arrow keys to choose." COLOR 14 LOCATE 9, 2: PRINT "The options mean the following:" COLOR 12 LOCATE 10, 2: PRINT "Sc = Score Mode" LOCATE 11, 2: PRINT "1 - 14 = Level Mode (As you complete levels more become avaliable)" LOCATE 12, 2: PRINT "Cs = Cut Scene (Only available if all the levels have been completed)" LOCATE 13, 2: PRINT "C0 - C9 = Custom Levels (Can be used once the game has been completed)" LOCATE 14, 2: PRINT "" COLOR 14 LOCATE 15, 2: PRINT " <<< SCORE MODE >>>" LOCATE 16, 2: PRINT "" COLOR 7 LOCATE 17, 2: PRINT "In score mode you collect counters until you die. The top 10 scores are saved" LOCATE 18, 2: PRINT "and can be accessed by selecting High Scores from the main menu. Each counter" LOCATE 19, 2: PRINT "is worth 1 point but if you collect the counter in less than 5 seconds you get" LOCATE 20, 2: PRINT "bonus points depending on how quickly the counter was collected." COLOR 14 CASE 3 LOCATE 3, 32: PRINT "<<< LEVEL MODE >>>" COLOR 7 LOCATE 5, 2: PRINT "To complete a level you need to collect 10 counters but in the last level" LOCATE 6, 2: PRINT "there is only one counter to be collected. Once all the levels have been" LOCATE 7, 2: PRINT "completed you get the chance to create and save your own levels using the" LOCATE 8, 2: PRINT "level editor which can be accessed by selecting Create Level from the options" LOCATE 9, 2: PRINT "menu." LOCATE 10, 2: PRINT "" COLOR 14 LOCATE 11, 2: PRINT " <<< RESET GAME >>>" LOCATE 12, 2: PRINT "What it does:" COLOR 12 LOCATE 13, 2: PRINT "þ Clears all high scores." LOCATE 14, 2: PRINT "þ Erases all custom levels created." LOCATE 15, 2: PRINT "þ Puts you back to level one." LOCATE 16, 2: PRINT "" COLOR 7 LOCATE 17, 2: PRINT "If you want to create more than 10 custom levels, you move or rename the file:" LOCATE 18, 2: PRINT "LEVELS.DAT . A new level file will be created in the directiry containing the" LOCATE 19, 2: PRINT "Snake program. To use the old levels again, put the old level file back to the" LOCATE 20, 2: PRINT "game directory with the correct name (LEVELS.DAT)." COLOR 14 CASE 4 LOCATE 3, 31: PRINT "<<< LEVEL EDITOR >>>" LOCATE 4, 31: PRINT " " COLOR 7 LOCATE 5, 2: PRINT "The Level Editor allows you to create your own levels. The controls can be" LOCATE 6, 2: PRINT "found by scrolling to the first page of the instructions." COLOR 14 LOCATE 7, 2: PRINT "The various options do the following:" COLOR 12 LOCATE 8, 2: PRINT "F10 = Create a new level to work on." LOCATE 9, 2: PRINT "F4 = Modify: Snake speed 1(slow) - 10(fast)" LOCATE 10, 2: PRINT " Snake's starting position (X coordinate , Y coordinate)" LOCATE 11, 2: PRINT " Snakes starting direction (Up/Down/Left/Right)" LOCATE 12, 2: PRINT " Number of counters to collect (1 to 50)" LOCATE 13, 2: PRINT "F2 = Save the level you are working on." LOCATE 14, 2: PRINT "F3 = Load a previously saved level." LOCATE 15, 2: PRINT "F5 = Exit level editor." COLOR 7 LOCATE 17, 2: PRINT "By pressing Home the cursor's position becomes the Snake's starting position." LOCATE 18, 2: PRINT "To play a saved level, select Level from the options menu. Choose the slot" LOCATE 19, 2: PRINT "number you saved the level as. eg. If you saved the level in slot 7 you choose" LOCATE 20, 2: PRINT "C7 (C = Custom 7 = slot number)." LOCATE 22, 70: PRINT " " COLOR 14 END SELECT END SUB SUB GetInfo OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 IF LOF(1) = 0 THEN DATA$ = "01" FOR COUNT = 1 TO 10 DATA$ = DATA$ + " " NEXT COUNT DATA$ = DATA$ + "000000000000000000000000000000000000000000000000000000000000" FOR COUNT = 1 TO 242 BYTE$ = CHR$(ASC(MID$(DATA$, COUNT, 1)) - 30) PUT #1, COUNT, BYTE$ NEXT COUNT END IF IF LOF(1) > 0 THEN FOR COUNT = 1 TO 242 GET #1, COUNT, BYTE$ DATA$ = DATA$ + CHR$(ASC(BYTE$) + 30) NEXT COUNT MAXLEV = VAL(MID$(DATA$, 1, 2)) FOR COUNT = 0 TO 9 N$(COUNT + 1) = MID$(DATA$, 3 + (COUNT * 18), 18) S(COUNT + 1) = VAL(MID$(DATA$, 183 + (COUNT * 6), 6)) NEXT COUNT END IF CLOSE #1 END SUB SUB help DIM LEVEL$(1 TO 62, 1 TO 32) FOR Y = 1 TO 32 FOR X = 1 TO 62 LEVEL$(X, Y) = CHR$(POINT(10 * X, 10 * Y + 11) + 32) NEXT X NEXT Y CALL instructions(4) COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT "<> <> <> <> <> <>" FOR Y = 1 TO 32 FOR X = 1 TO 62 ColourPixel = ASC(LEVEL$(X, Y)) - 32 LINE (10 * X, 10 * Y + 11)-(10 * X + 9, 10 * Y + 20), ColourPixel, BF NEXT X NEXT Y END SUB SUB HighScores LINE (0, 0)-(640, 350), 1, BF DRAW "BM172,76 C4 ND183 R300 D183 NL300 BH P4,4 BF C8 NL299 U183 C12 L300 D183 BR63 BU C5 NU181 C5 BR164 U181 BF27 NR45 L253" DRAW "BM160,292 C4 ND19 R324 D19 NL324 BH P4,4 BF C8 NL323 U19 C12 L324 D19" COLOR 14, 4 LOCATE 7, 24: PRINT "PLACE": LOCATE 7, 32: PRINT "NAME": LOCATE 7, 52: PRINT "SCORE" LOCATE 9, 25: PRINT "1st": LOCATE 10, 25: PRINT "2nd": LOCATE 11, 25: PRINT "3rd": LOCATE 12, 25: PRINT "4th": LOCATE 13, 25: PRINT "5th": LOCATE 14, 25: PRINT "6th": LOCATE 15, 25: PRINT "7th": LOCATE 16, 25: PRINT "8th": LOCATE 17, 25: PRINT "9th": LOCATE 18, 25: PRINT "10th": COLOR 10, 4 LOCATE 9, 32: PRINT N$(1): LOCATE 9, 51: PRINT S(1) LOCATE 10, 32: PRINT N$(2): LOCATE 10, 51: PRINT S(2) LOCATE 11, 32: PRINT N$(3): LOCATE 11, 51: PRINT S(3) LOCATE 12, 32: PRINT N$(4): LOCATE 12, 51: PRINT S(4) LOCATE 13, 32: PRINT N$(5): LOCATE 13, 51: PRINT S(5) LOCATE 14, 32: PRINT N$(6): LOCATE 14, 51: PRINT S(6) LOCATE 15, 32: PRINT N$(7): LOCATE 15, 51: PRINT S(7) LOCATE 16, 32: PRINT N$(8): LOCATE 16, 51: PRINT S(8) LOCATE 17, 32: PRINT N$(9): LOCATE 17, 51: PRINT S(9) LOCATE 18, 32: PRINT N$(10): LOCATE 18, 51: PRINT S(10) COLOR 11, 4 LOCATE 22, 22: PRINT "Press CTRL+C to clear High Score table." t = TIMER DO SELECT CASE INKEY$ CASE CHR$(27): END CASE CHR$(3): FOR COUNT = 1 TO 10 N$(COUNT) = " " S(COUNT) = 0 NEXT FOR Y = 9 TO 18 COLOR 10 LOCATE Y, 32: PRINT " ": LOCATE Y, 51: PRINT " 0 " NEXT Y OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 IF MAXLEV >= 10 THEN DATA$ = MID$(STR$(MAXLEV), 2, 2) ELSE DATA$ = "0" + MID$(STR$(MAXLEV), 2, 1) FOR COUNT = 1 TO 10 DATA$ = DATA$ + " " NEXT COUNT DATA$ = DATA$ + "000000000000000000000000000000000000000000000000000000000000" FOR COUNT = 1 TO 242 BYTE$ = CHR$(ASC(MID$(DATA$, COUNT, 1)) - 30) PUT #1, COUNT, BYTE$ NEXT COUNT CLOSE #1 CASE "": CASE ELSE: EXIT DO END SELECT LOOP UNTIL TIMER - t > 60 COLOR 15, 0 END SUB SUB InitCustomMode COLOR 15, 0 CALL ClsScreen CALL DrawCustomLev(Z1, Z2, Z3, Z4, Z5, Z6) LOCATE 1, 1: PRINT " <<< START >>>   BACK TO MENU " DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 DO SELECT CASE INKEY$ CASE CHR$(0) + "K": LOCATE 1, 14: PRINT "<<< START >>>": LOCATE 1, 52: PRINT " BACK TO MENU ": DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 CASE CHR$(0) + "M": LOCATE 1, 52: PRINT "<<< BACK TO MENU >>>": LOCATE 1, 14: PRINT " START ": DRAW "BM 308,7 P4,0 BM331,7 P10,0": POSI = 1 CASE CHR$(27): END CASE CHR$(13): EXIT DO END SELECT LOOP IF POSI = 0 THEN CALL CustomMode(Z1, Z2, Z3, Z4, Z5, Z6) END SUB SUB InitLevMode COLOR 15, 0 CALL ClsScreen CALL DrawLevel(Z1, Z2, Z3, Z4) LOCATE 1, 1: PRINT " <<< START >>>   BACK TO MENU " DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 DO SELECT CASE INKEY$ CASE CHR$(0) + "K": LOCATE 1, 14: PRINT "<<< START >>>": LOCATE 1, 52: PRINT " BACK TO MENU ": DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 CASE CHR$(0) + "M": LOCATE 1, 52: PRINT "<<< BACK TO MENU >>>": LOCATE 1, 14: PRINT " START ": DRAW "BM 308,7 P4,0 BM331,7 P10,0": POSI = 1 CASE CHR$(13): EXIT DO CASE CHR$(27): END END SELECT LOOP IF POSI = 0 THEN IF LEVEL < 14 THEN CALL LevelMode(Z1, Z2, Z3, Z4) ELSE CALL LastLevel END IF END SUB SUB InitScrMode COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT " <<< START >>>   BACK TO MENU " DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 DO SELECT CASE INKEY$ CASE CHR$(0) + "K": LOCATE 1, 14: PRINT "<<< START >>>": LOCATE 1, 52: PRINT " BACK TO MENU ": DRAW "BM 308,7 P10,0 BM331,7 P4,0": POSI = 0 CASE CHR$(0) + "M": LOCATE 1, 52: PRINT "<<< BACK TO MENU >>>": LOCATE 1, 14: PRINT " START ": DRAW "BM 308,7 P4,0 BM331,7 P10,0": POSI = 1 CASE CHR$(27): END CASE CHR$(13): EXIT DO END SELECT LOOP IF POSI = 0 THEN CALL ScoreMode END SUB SUB instructions (page) PALETTE 9, 0 COLOR 14, 1 LOCATE 2, 1: PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" FOR Y = 3 TO 20 LOCATE Y, 1: PRINT "³ ³" NEXT Y LOCATE 21, 1: PRINT "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´" LOCATE 22, 1: PRINT "³ ³" LOCATE 23, 1: PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ" PAINT (1, 1), 9, 14 COLOR 10: LOCATE 22, 4: PRINT " PREVIOUS" IF page = 1 THEN LOCATE 22, 30: PRINT "ENTER = Back to main menu" ELSE LOCATE 22, 29: PRINT "ENTER = Back to Level Editor" END IF LOCATE 22, 70: PRINT "NEXT " COLOR 14 CALL DrawPage(page) DO SELECT CASE INKEY$ CASE CHR$(13): EXIT DO CASE CHR$(27): END CASE CHR$(0) + "K": IF page > 1 THEN page = page - 1: CALL DrawPage(page) CASE CHR$(0) + "M": IF page < 4 THEN page = page + 1: CALL DrawPage(page) END SELECT LOOP PALETTE END SUB SUB LastLevel DO X = 0: Y = 21: AX = 10: AY = 0 LOCATE 1, 1: PRINT "COUNTERS: 0 LEVEL: " LOCATE 1, 22: PRINT LEVEL Counters = 0 LENGTH = 3 FOR c = 3 TO 1985 X(c) = 0: Y(c) = 0 NEXT c DO CALL pause(3) SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": IF AY = 0 THEN AY = 10: AX = 0 CASE IS = CHR$(0) + "H": IF AY = 0 THEN AY = -10: AX = 0 CASE IS = CHR$(0) + "M": IF AX = 0 THEN AX = 10: AY = 0 CASE IS = CHR$(0) + "K": IF AX = 0 THEN AX = -10: AY = 0 CASE IS = CHR$(13): EXIT DO CASE IS = CHR$(32): PLAY "O5 L30 C" t = TIMER LOCATE 1, 33: PRINT "<<< PAUSED >>>" DO: SELECT CASE INKEY$ CASE IS = CHR$(27): END CASE IS = CHR$(32): EXIT DO END SELECT: LOOP LOCATE 1, 33: PRINT " " Btime = Btime + (TIMER - t) PLAY "O5 L30 C" CASE IS = CHR$(27): END END SELECT 'Cheat for last level 'IF POINT(X + 10, Y) = 12 AND AX = 10 THEN AX = 0: AY = 10 'IF POINT(X - 2, Y) = 12 AND AX = -10 THEN AX = 0: AY = -10 'IF POINT(X, Y + 10) = 12 AND AY = 10 THEN AY = 0: AX = -10 'IF POINT(X, Y - 2) = 12 AND AY = -10 THEN AY = 0: AX = 10 X = X + AX Y = Y + AY IF POINT(X + 5, Y + 5) = 10 THEN LOCATE 1, 1: PRINT " <<< LEVEL MODE COMPLETED!!! >>> " MAXLEV = 25 LEVEL = 15 FOR Fr = 200 TO 3000 STEP 20 SOUND Fr, .1 SOUND Fr - 100, .1 NEXT Fr FOR c = 1 TO 6 FOR Fr = 3000 TO 200 STEP -200 SOUND Fr, .1 SOUND Fr - 100, .1 NEXT Fr FOR Fr = 200 TO 3000 STEP 200 SOUND Fr, .1 SOUND Fr - 100, .1 NEXT Fr NEXT FOR c = 1 TO 10 NEXT FOR Fr = 3000 TO 200 STEP -100 SOUND Fr, .1 SOUND Fr - 100, .1 NEXT Fr EXIT DO END IF IF POINT(X + 5, Y + 5) = 12 OR POINT(X + 5, Y + 5) = 14 THEN LINE (150, 181)-(159, 190), 1, BF PLAY "O0L10G" EXIT DO ELSE LINE (X, Y)-(X + 9, Y + 9), 14, BF END IF IF Colour = 1 THEN Colour = 10 ELSE Colour = 1 LINE (150, 181)-(159, 190), Colour, BF LOOP IF LEVEL = 14 THEN CALL ClsScreen CALL DrawLevel(X, Y, AX, AY) CALL Choose(CHOICE) ELSE CALL CutScene CHOICE = 1 END IF LOOP UNTIL CHOICE = 1 END SUB SUB LevelEdit COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT "<> <> <> <> <> <>" SPD = 5 POSXX = 31 POSYY = 16 STRTPO$ = "R" CNTRS = 10 Y = 15: X = 30: PIXEL = 1 DO SELECT CASE INKEY$ CASE CHR$(0) + "H": IF Y > 0 THEN CALL MoveCursor(DrawType, X, Y, "U", PIXEL) CASE CHR$(0) + "P": IF Y < 31 THEN CALL MoveCursor(DrawType, X, Y, "D", PIXEL) CASE CHR$(0) + "K": IF X > 0 THEN CALL MoveCursor(DrawType, X, Y, "L", PIXEL) CASE CHR$(0) + "M": IF X < 61 THEN CALL MoveCursor(DrawType, X, Y, "R", PIXEL) CASE CHR$(0) + "D": CALL ClsScreen: DrawType = 0: SPD = 5: POSXX = 30: POSYY = 15: STRTPO$ = "R": CNTRS = 10: Y = 15: X = 30: PIXEL = 1: LOCATE 1, 1: PRINT "<> <> <> <> <> <>" CASE CHR$(0) + ";": LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), PIXEL, BF: CALL help CASE CHR$(0) + "<": LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), PIXEL, BF: CALL Save(SPD, POSXX, POSYY, STRTPO$, CNTRS): Y = 15: X = 30: DrawType = 0: PIXEL = POINT(10 * X + 10, 10 * Y + 21) CASE CHR$(0) + "=": LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), PIXEL, BF: CALL Load(SPD, POSXX, POSYY, STRTPO$, CNTRS): Y = 15: X = 30: DrawType = 0: PIXEL = POINT(10 * X + 10, 10 * Y + 21) CASE CHR$(0) + ">": CALL Modify(SPD, POSXX, POSYY, STRTPO$, CNTRS) CASE CHR$(0) + "?": EXIT DO CASE CHR$(32): DrawType = 1 CASE CHR$(13): IF DrawType = 1 THEN DrawType = 0: PIXEL = 12 IF DrawType = 2 THEN DrawType = 0: PIXEL = 1 CASE CHR$(8): DrawType = 2 CASE CHR$(0) + "S": PIXEL = 1 CASE CHR$(0) + "R": PIXEL = 12 CASE CHR$(0) + "G": POSXX = X: POSYY = Y + 1 CASE CHR$(27): END END SELECT IF alternate < 20 THEN alternate = alternate + .02 ELSE alternate = 0 IF alternate <= 15 THEN IF DrawType = 0 THEN ColorCursor = 10 IF DrawType = 1 THEN ColorCursor = 4 IF DrawType = 2 THEN ColorCursor = 9 ELSE IF DrawType = 0 THEN ColorCursor = PIXEL IF DrawType = 1 THEN ColorCursor = 12 IF DrawType = 2 THEN ColorCursor = 1 END IF LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), ColorCursor, BF LOOP END SUB SUB LevelMode (X, Y, AX, AY) DO DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 31) + 3) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 LINE (CX, CY)-(CX + 9, CY + 9), 10, BF LOCATE 1, 1: PRINT "COUNTERS: 0 LEVEL: " LOCATE 1, 22: PRINT LEVEL Counters = 0 LENGTH = 3 FOR c = 3 TO 1985 X(c) = 0: Y(c) = 0 NEXT c DO CALL pause(SPDLEV) SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": IF AY = 0 THEN AY = 10: AX = 0 CASE IS = CHR$(0) + "H": IF AY = 0 THEN AY = -10: AX = 0 CASE IS = CHR$(0) + "M": IF AX = 0 THEN AX = 10: AY = 0 CASE IS = CHR$(0) + "K": IF AX = 0 THEN AX = -10: AY = 0 CASE IS = CHR$(13): EXIT DO CASE IS = CHR$(32): PLAY "O5 L30 C" t = TIMER LOCATE 1, 33: PRINT "<<< PAUSED >>>" DO: SELECT CASE INKEY$ CASE IS = CHR$(27): END CASE IS = CHR$(32): EXIT DO END SELECT: LOOP LOCATE 1, 33: PRINT " " Btime = Btime + (TIMER - t) PLAY "O5 L30 C" CASE IS = CHR$(27): END END SELECT X = X + AX Y = Y + AY IF POINT(X + 5, Y + 5) = 10 THEN PLAY "O4L20G" Counters = Counters + 1 LOCATE 1, 1: PRINT "COUNTERS:"; Counters IF Counters < 10 THEN LENGTH = LENGTH + 10 DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 32) + 2) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 AND (CX <> X(LENGTH) AND CY <> Y(LENGTH)) LINE (CX, CY)-(CX + 9, CY + 9), 10, BF ELSE IF LEVEL = MAXLEV THEN MAXLEV = MAXLEV + 1 IF MAXLEV >= 10 THEN DATA$ = MID$(STR$(MAXLEV), 2, 2) ELSE DATA$ = "0" + MID$(STR$(MAXLEV), 2, 1) OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 D1$ = CHR$(ASC(MID$(DATA$, 1, 1)) - 30) D2$ = CHR$(ASC(MID$(DATA$, 2, 1)) - 30) PUT #1, 1, D1$ PUT #1, 2, D2$ CLOSE #1 END IF LEVEL = LEVEL + 1 LOCATE 1, 28: PRINT "<<< LEVEL COMPLETE >>>" CALL AwaitKey EXIT DO END IF END IF IF POINT(X + 5, Y + 5) = 12 OR POINT(X + 5, Y + 5) = 14 THEN PLAY "O0L10G" LOCATE 1, 32: PRINT "<<< YOU DIED! >>>" CALL AwaitKey EXIT DO ELSE LINE (X, Y)-(X + 9, Y + 9), 14, BF FOR c = LENGTH TO 2 STEP -1 X(c) = X(c - 1) Y(c) = Y(c - 1) NEXT X(1) = X: Y(1) = Y IF POINT(X(LENGTH), Y(LENGTH)) = 14 THEN LINE (X(LENGTH), Y(LENGTH))-(X(LENGTH) + 9, Y(LENGTH) + 9), 1, BF END IF END IF LOOP CALL ClsScreen CALL DrawLevel(X, Y, AX, AY) CALL Choose(CHOICE) IF LEVEL = 14 THEN CALL LastLevel: EXIT DO LOOP UNTIL CHOICE = 1 END SUB SUB LevSel DRAW "BM399,139 C4 ND15 R33 D15 NL33 BH P4,4 BF C8 NL33 U15 C12 L33 D15" DO SELECT CASE LEVEL CASE 0: LOCATE 11, 52: PRINT "Sc" CASE 1 TO 14: LOCATE 11, 51: PRINT LEVEL CASE 15: LOCATE 11, 52: PRINT "Cs" CASE 16 TO 25: LOCATE 11, 52: PRINT "C" + RIGHT$(STR$(LEVEL - 16), 1) END SELECT DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "K": IF LEVEL > 0 THEN LEVEL = LEVEL - 1 EXIT DO CASE IS = CHR$(0) + "M": IF LEVEL < MAXLEV THEN LEVEL = LEVEL + 1 EXIT DO CASE IS = CHR$(13), CHR$(0) + "P", CHR$(0) + "H": ENT = 1: EXIT DO CASE IS = CHR$(27): END END SELECT LOOP LOOP UNTIL ENT = 1 END SUB SUB Load (speedlevel, StartposX, Startposy, Direction$, Counters) Char$ = " " DIM LEVEL$(1 TO 62, 1 TO 32) FOR Y = 1 TO 32 FOR X = 1 TO 62 LEVEL$(X, Y) = CHR$(POINT(10 * X, 10 * Y + 11) + 32) NEXT X NEXT Y LINE (0, 0)-(640, 350), 1, BF OPEN "C:LEVELS.DAT" FOR BINARY AS #1 L$ = "L": CALL SlotChoose(slot, L$) IF slot <= 9 THEN SEEK #1, slot * 1989 + 11 GET #1, , Char$: speedlevel = ASC(Char$) GET #1, , Char$: StartposX = ASC(Char$) GET #1, , Char$: Startposy = ASC(Char$) GET #1, , Char$: Direction$ = Char$ GET #1, , Char$: Counters = ASC(Char$) FOR Y = 1 TO 32 FOR X = 1 TO 62 GET #1, , Char$: LEVEL$(X, Y) = Char$ NEXT X NEXT Y END IF CLOSE COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT "<> <> <> <> <> <>" FOR Y = 1 TO 32 FOR X = 1 TO 62 ColourPixel = ASC(LEVEL$(X, Y)) - 32 LINE (10 * X, 10 * Y + 11)-(10 * X + 9, 10 * Y + 20), ColourPixel, BF NEXT X NEXT Y END SUB SUB Menu (O1$, O2$, O3$, O4$, O5$, sel) DIM CLRMU(0 TO 4680) Y = 13 X = 40 LINE (0, 0)-(640, 350), 1, BF DRAW "BM220,120 C12 ND100 R175 D100 NL175 BH P4,12 BF C8 NU99 NL174 L72 C4 D80 L30 U80 R30 BG4 P4,4 BE4 C8 D80 BL30 C12 NU80" DRAW "BM328,300 C2 NL37 U5EU3EU2EUE2UEUE5UE2L2GL2GLGLGLGLG2LG8DG3DG2DGDGD BE4 P2,2 BU4 C2 U11EU4EU2EU2EU2E2UE2UE2LG2LG3LG6DG2DGDGDGDGD2GD2GD3GD2FD5 BU6 P2,2 BL C2 UHU2HUHUH2UH4UH7LH3LHLDFDFDF2DFDFD2FDFD2FD2FD2FD3FD5 BE6 P2,2 BU11" DRAW "C2 U4HU3HU3HU2HUHUHUHUHUHRF2RF4RF6DF2DFDFD BL P2,2 BR10 C2 UE8RERERER2G2DGDGDGD3GD3 BL P2,2" DRAW "BM328,300 C8 U5EU3EU2EUE2UEUE5UE2 C10 L2GL2GLGLGLGLG2LG8DG3DG2DGDGD BE4 BU4 C8 U11EU4EU2EU2EU2E2UE2UE2L C10 G2LG3LG6DG2DGDGDGDGD2GD2GD3GD2FD5 BU6 BL C8 UHU2HUHUH2UH4UH7LH3LHL C10 DFDFDF2DFDFD2FDFD2FD2FD2FD3FD5 BE6 BU11" DRAW "C10 U4HU3HU3HU2HUHUHUHUHUHR C8 F2RF4RF6DF2DFDFD BL BR10 C10 UE8RERERER2 C8 G2DGDGDGD3GD3 BM314,292 C10 U0 BM315,277 C8 U2EU2 BM306,277 C10 D0 BM301,292 C8 D1 F D6 BM296,283 C8 H2 BM279,267 C2 U0 BM289,259 C2 U0 BM329,266 C2 U0 BM339,274 C2 U0" DRAW "BM365,150 C14 R3UR3URRURURURURUURUURUURU3RU4RU6LU3LUULUULULULULLULULLUL8DL3DLDLDDLDLD R9 DRDRDDRD3RD4RD5LD5LD3LD3LD3 BE6 P14,14" DRAW "BM325,119 C14 R9 HLUULUULULLUL4UL6DLLDLDDLDDLDLLDL3DL3ULLLULLULLULUULULLULLUL3UL3DL3DLLDLLDLDDLDDLDL R9 DRDRDRDRDRRDRRDR3DR3DR5DR7UR4UR4URRURRURURUURUUR BH3 P14,14" GET (179, 129)-(237, 206), CLRMU sel = 1 ENT = 0 DO COLOR 5, 4 LOCATE Y - 2, X - 9: PRINT O1$ LOCATE Y - 1, X - 9: PRINT O2$ LOCATE Y + 0, X - 9: PRINT O3$ LOCATE Y + 1, X - 9: PRINT O4$ LOCATE Y + 2, X - 9: PRINT O5$ COLOR 10, 4 SELECT CASE sel CASE IS = 1: LOCATE Y - 2, X - 9: PRINT O1$: PUT (179, 129), CLRMU, PSET: DRAW "BM219,130 C14 L4L9HL14GLGLG4D7FDF3RFRFR2FR8FR12ER8ER5ER2E2U2H2L26HL4H2ER4FR10ER2U7 BG2 P14,14 BM231,143 C9 RDL" CASE IS = 2: LOCATE Y - 1, X - 9: PRINT O2$: PUT (179, 129), CLRMU, PSET: DRAW "BM219,132 C14 GL2GL6GL6GL2GLGLG3DG2D6FDF8RFRFRFRFR3FR3FR12ER3ERE2U2H2L9HL3HL2HLHLH2LH4E3R2ER2ER2ERU10 BG2 P14,14 BM231,159 C9 RDL" CASE IS = 3: LOCATE Y + 0, X - 9: PRINT O3$: PUT (179, 129), CLRMU, PSET: DRAW "BM219,135 C14 LGL2GL2GLG2LG2LG4LG2DGDGD12FDFDF3RFRF2RFRFR2FRFR4FR12E2U2H2LHL5HL3H2LH2LH5U7E2UERERERERU12 BG2 P14,14 BM229,174 C9 RDL" CASE IS = 4: LOCATE Y + 1, X - 9: PRINT O4$: PUT (179, 129), CLRMU, PSET: DRAW "BM219,145 C14 NUL3GLGLGLG3LG2DG2DGD2GD2GD6FD3FD2FDF3DF4RFRFRFRFR2FR13E2U2H2L4HL2H2LH4UHUHUHU2HU5EUEUEUEU13 BG2 P14,14 BM231,187 C9 RDL" CASE IS = 5: LOCATE Y + 2, X - 9: PRINT O5$: PUT (179, 129), CLRMU, PSET: DRAW "BM219,150 C14 GLG8DGDGDGD2GD3GD10FD3FDFD2F2DF2DF5RF2RFRFR10E2U2H2L3HL2H3UH2UHU2HU6HU31 BG2 P14,14 BM231,201 C9 RDL" END SELECT DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": sel = sel + 1: IF sel = 6 THEN sel = 1 EXIT DO CASE IS = CHR$(0) + "H": sel = sel - 1: IF sel = 0 THEN sel = 5 EXIT DO CASE IS = CHR$(13): ENT = 1: EXIT DO CASE IS = CHR$(27): END END SELECT LOOP LOOP UNTIL ENT = 1 END SUB SUB Modify (SPD, SPOSX, SPOSY, Sdir$, CNTRS) DIM LEVEL$(1 TO 62, 1 TO 32) FOR Y = 1 TO 32 FOR X = 1 TO 62 LEVEL$(X, Y) = CHR$(POINT(10 * X, 10 * Y + 11) + 32) NEXT X NEXT Y Pn = 1 DO sel = 0 LINE (0, 0)-(640, 350), 1, BF COLOR 14, 4 DRAW "BM140,90 C4 ND160 R217 D160 NL217 BH P4,4 F C8 NL216 U160 C12 L217 D160" DRAW "BM256,239 C8 NL32 U16 C12 L33 D16" COLOR 5 LOCATE 8, 20: PRINT "Speed (1-10):" LOCATE 10, 20: PRINT "Starting Position (X,Y):" LOCATE 12, 20: PRINT "Starting Direction:" LOCATE 14, 20: PRINT "Counters (1-50):" LOCATE 17, 30: PRINT "OK" COLOR 14 SELECT CASE Pn CASE 1: LOCATE 8, 20: PRINT "Speed (1-10):" CASE 2: LOCATE 10, 20: PRINT "Starting Position (X,Y):" CASE 3: LOCATE 12, 20: PRINT "Starting Direction:" CASE 4: LOCATE 14, 20: PRINT "Counters (1-50):" CASE 5: COLOR 10: LOCATE 17, 30: PRINT "OK" END SELECT DO DO SELECT CASE INKEY$ CASE CHR$(13): sel = 1: EXIT DO CASE IS = CHR$(0) + "H": IF Pn > 1 THEN Pn = Pn - 1 ELSE Pn = 5 EXIT DO CASE IS = CHR$(0) + "P": IF Pn < 5 THEN Pn = Pn + 1 ELSE Pn = 1 EXIT DO CASE IS = CHR$(27): END END SELECT LOOP COLOR 5 LOCATE 8, 20: PRINT "Speed (1-10):" LOCATE 10, 20: PRINT "Starting Position (X,Y):" LOCATE 12, 20: PRINT "Starting Direction:" LOCATE 14, 20: PRINT "Counters (1-50):" LOCATE 17, 30: PRINT "OK" COLOR 14 SELECT CASE Pn CASE 1: LOCATE 8, 20: PRINT "Speed (1-10):" CASE 2: LOCATE 10, 20: PRINT "Starting Position (X,Y):" CASE 3: LOCATE 12, 20: PRINT "Starting Direction:" CASE 4: LOCATE 14, 20: PRINT "Counters (1-50):" CASE 5: COLOR 10: LOCATE 17, 30: PRINT "OK" END SELECT LOOP UNTIL sel = 1 COLOR 10 SELECT CASE Pn CASE 1: LOCATE 8, 46: PRINT " " LOCATE 8, 46: PRINT 11 - SPD DRAW "BM392,112 C8 NL32 U15 C12 L33 D15" DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "M": IF SPD > 1 THEN SPD = SPD - 1: LOCATE 8, 46: PRINT 11 - SPD CASE IS = CHR$(0) + "K": IF SPD < 10 THEN SPD = SPD + 1: LOCATE 8, 46: PRINT 11 - SPD CASE IS = CHR$(27): END CASE IS = CHR$(13): EXIT DO END SELECT LOOP CASE 2: LOCATE 10, 46: PRINT " " LOCATE 10, 46: COLOR 10: PRINT SPOSX; : COLOR 14: PRINT ","; SPOSY DRAW "BM432,140 C8 NL72 U15 C12 L73 D15" DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "M": IF SPOSX < 63 THEN SPOSX = SPOSX + 1: LOCATE 10, 46: COLOR 10: PRINT SPOSX; : COLOR 14: PRINT ","; SPOSY CASE IS = CHR$(0) + "K": IF SPOSX > 0 THEN SPOSX = SPOSX - 1: LOCATE 10, 46: COLOR 10: PRINT SPOSX; : COLOR 14: PRINT ","; SPOSY CASE IS = CHR$(27): END CASE IS = CHR$(13): EXIT DO END SELECT LOOP LOCATE 10, 46: COLOR 14: PRINT SPOSX; ","; : COLOR 10: PRINT SPOSY DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "M": IF SPOSY < 33 THEN SPOSY = SPOSY + 1: LOCATE 10, 46: COLOR 14: PRINT SPOSX; ","; : COLOR 10: PRINT SPOSY CASE IS = CHR$(0) + "K": IF SPOSY > 0 THEN SPOSY = SPOSY - 1: LOCATE 10, 46: COLOR 14: PRINT SPOSX; ","; : COLOR 10: PRINT SPOSY CASE IS = CHR$(27): END CASE IS = CHR$(13): EXIT DO END SELECT LOOP CASE 3: seltd = 0 COLOR 5 LOCATE 12, 46: PRINT " UP " LOCATE 13, 46: PRINT " DOWN " LOCATE 14, 46: PRINT " LEFT " LOCATE 15, 46: PRINT " RIGHT " COLOR 10 SELECT CASE Sdir$ CASE IS = "U": LOCATE 12, 46: PRINT " UP ": ponn = 1 CASE IS = "D": LOCATE 13, 46: PRINT " DOWN ": ponn = 2 CASE IS = "L": LOCATE 14, 46: PRINT " LEFT ": ponn = 3 CASE IS = "R": LOCATE 15, 46: PRINT " RIGHT ": ponn = 4 END SELECT DRAW "BM416,210 C8 NL57 U57 C12 L57 D57" DO DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": IF ponn < 4 THEN ponn = ponn + 1 ELSE ponn = 1 EXIT DO CASE IS = CHR$(0) + "H": IF ponn > 1 THEN ponn = ponn - 1 ELSE ponn = 4 EXIT DO CASE IS = CHR$(27): END CASE IS = CHR$(13): seltd = 1: EXIT DO END SELECT LOOP COLOR 5 LOCATE 12, 46: PRINT " UP " LOCATE 13, 46: PRINT " DOWN " LOCATE 14, 46: PRINT " LEFT " LOCATE 15, 46: PRINT " RIGHT " COLOR 10 SELECT CASE ponn CASE 1: LOCATE 12, 46: PRINT " UP ": Sdir$ = "U" CASE 2: LOCATE 13, 46: PRINT " DOWN ": Sdir$ = "D" CASE 3: LOCATE 14, 46: PRINT " LEFT ": Sdir$ = "L" CASE 4: LOCATE 15, 46: PRINT " RIGHT ": Sdir$ = "R" END SELECT LOOP UNTIL seltd = 1 CASE 4: LOCATE 14, 46: PRINT " " LOCATE 14, 46: PRINT CNTRS DRAW "BM392,196 C8 NL32 U15 C12 L33 D15" DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "M": IF CNTRS < 50 THEN CNTRS = CNTRS + 1: LOCATE 14, 46: PRINT CNTRS CASE IS = CHR$(0) + "K": IF CNTRS > 1 THEN CNTRS = CNTRS - 1: LOCATE 14, 46: PRINT CNTRS CASE IS = CHR$(27): END CASE IS = CHR$(13): EXIT DO END SELECT LOOP CASE 5: DRAW "BM256,239 C12 NL32 U16 C8 L33 D16" END SELECT LOOP UNTIL sel = 1 AND Pn = 5 COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT "<> <> <> <> <> <>" FOR Y = 1 TO 32 FOR X = 1 TO 62 ColourPixel = ASC(LEVEL$(X, Y)) - 32 LINE (10 * X, 10 * Y + 11)-(10 * X + 9, 10 * Y + 20), ColourPixel, BF NEXT X NEXT Y IF SPOSX = 0 AND (Sdir$ = "D" OR Sdir$ = "U") THEN SPOSX = 1 IF SPOSX = 63 AND (Sdir$ = "D" OR Sdir$ = "U") THEN SPOSX = 62 IF SPOSY = 0 AND (Sdir$ = "R" OR Sdir$ = "L") THEN SPOSY = 1 IF SPOSY = 33 AND (Sdir$ = "R" OR Sdir$ = "L") THEN SPOSY = 32 IF SPOSX >= 60 AND Sdir$ = "R" THEN Sdir$ = "L" IF SPOSX <= 3 AND Sdir$ = "L" THEN Sdir$ = "R" IF SPOSY >= 30 AND Sdir$ = "D" THEN Sdir$ = "U" IF SPOSY <= 3 AND Sdir$ = "U" THEN Sdir$ = "D" END SUB SUB MoveCursor (DrawCol, X, Y, Direction$, ColorPixel) IF DrawCol = 0 THEN LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), ColorPixel, BF IF DrawCol = 1 THEN LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), 12, BF IF DrawCol = 2 THEN LINE (10 * X + 10, 10 * Y + 21)-(10 * X + 19, 10 * Y + 30), 1, BF SELECT CASE Direction$ CASE IS = "U": Y = Y - 1 CASE IS = "D": Y = Y + 1 CASE IS = "L": X = X - 1 CASE IS = "R": X = X + 1 END SELECT ColorPixel = POINT(10 * X + 10, 10 * Y + 21) END SUB SUB NewScore DIM S$(1 TO 10) SELECT CASE SCORE CASE IS > S(1): Place$ = "1st": STOP$ = "!" CASE S(2) + 1 TO S(1): Place$ = "2nd": STOP$ = "." CASE S(3) + 1 TO S(2): Place$ = "3rd": STOP$ = "." CASE S(4) + 1 TO S(3): Place$ = "4th": STOP$ = "." CASE S(5) + 1 TO S(4): Place$ = "5th": STOP$ = "." CASE S(6) + 1 TO S(5): Place$ = "6th": STOP$ = "." CASE S(7) + 1 TO S(6): Place$ = "7th": STOP$ = "." CASE S(8) + 1 TO S(7): Place$ = "8th": STOP$ = "." CASE S(9) + 1 TO S(8): Place$ = "9th": STOP$ = "." CASE S(10) + 1 TO S(9): Place$ = "10th": STOP$ = "." END SELECT LINE (0, 0)-(640, 350), 1, BF DRAW "BM173,147 C4 ND42 R299 D42 NL299 BH P4,4 BF C8 NL298 U42 C12 L299 D42" COLOR 14, 4 LOCATE 12, 24: PRINT "Congratulations you came "; Place$; " place"; STOP$ LOCATE 13, 24: PRINT "Enter your name:" COLOR 10, 4 DO CH$ = INPUT$(1) SELECT CASE CH$ CASE CHR$(8): IF LEN(NAME$) >= 1 THEN NAME$ = LEFT$(NAME$, LEN(NAME$) - 1) CASE IS = CHR$(27): END END SELECT IF (ASC(CH$) >= 32 AND ASC(CH$) <= 126) AND LEN(NAME$) < 18 THEN NAME$ = NAME$ + CH$ LOCATE 13, 41: PRINT " " LOCATE 13, 41: PRINT NAME$ LOOP UNTIL CH$ = CHR$(13) AND LEN(NAME$) > 0 '----------------------------------- SELECT CASE SCORE CASE IS > S(1) CALL NewScoreC(2) N$(1) = NAME$ S(1) = SCORE CASE S(2) + 1 TO S(1) CALL NewScoreC(3) N$(2) = NAME$ S(2) = SCORE CASE S(3) + 1 TO S(2) CALL NewScoreC(4) N$(3) = NAME$ S(3) = SCORE CASE S(4) + 1 TO S(3) CALL NewScoreC(5) N$(4) = NAME$ S(4) = SCORE CASE S(5) + 1 TO S(4) CALL NewScoreC(6) N$(5) = NAME$ S(5) = SCORE CASE S(6) + 1 TO S(5) CALL NewScoreC(7) N$(6) = NAME$ S(6) = SCORE CASE S(7) + 1 TO S(6) CALL NewScoreC(8) N$(7) = NAME$ S(7) = SCORE CASE S(8) + 1 TO S(7) CALL NewScoreC(9) N$(8) = NAME$ S(8) = SCORE CASE S(9) + 1 TO S(8) CALL NewScoreC(10) N$(9) = NAME$ S(9) = SCORE CASE S(10) + 1 TO S(9) N$(10) = NAME$ S(10) = SCORE END SELECT '----------------------------------------- OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 IF MAXLEV >= 10 THEN MAXLEV$ = MID$(STR$(MAXLEV), 2, 2) ELSE MAXLEV$ = "0" + MID$(STR$(MAXLEV), 2, 1) FOR COUNT = 1 TO 10 IF S(COUNT) < 10 THEN S$(COUNT) = "00000" + MID$(STR$(S(COUNT)), 2, 1) IF S(COUNT) >= 10 THEN S$(COUNT) = "0000" + MID$(STR$(S(COUNT)), 2, 2) IF S(COUNT) >= 100 THEN S$(COUNT) = "000" + MID$(STR$(S(COUNT)), 2, 3) IF S(COUNT) >= 1000 THEN S$(COUNT) = "00" + MID$(STR$(S(COUNT)), 2, 4) IF S(COUNT) >= 10000 THEN S$(COUNT) = "0" + MID$(STR$(S(COUNT)), 2, 5) IF S(COUNT) >= 100000 THEN S$(COUNT) = MID$(STR$(S(COUNT)), 2, 6) NEXT COUNT FOR COUNTT = 1 TO 10 IF LEN(N$(COUNTT)) < 18 THEN FOR COUNT = 1 TO 18 - LEN(N$(COUNTT)) N$(COUNTT) = N$(COUNTT) + " " NEXT COUNT END IF NEXT COUNTT DATA$ = MAXLEV$ FOR COUNT = 1 TO 10 DATA$ = DATA$ + N$(COUNT) NEXT COUNT FOR COUNT = 1 TO 10 DATA$ = DATA$ + S$(COUNT) NEXT COUNT FOR COUNT = 1 TO 242 BYTE$ = CHR$(ASC(MID$(DATA$, COUNT, 1)) - 30) PUT #1, COUNT, BYTE$ NEXT COUNT CLOSE #1 COLOR 15, 0 END SUB SUB NewScoreC (NUMBER) FOR COUNT = 10 TO NUMBER STEP -1 N$(COUNT) = N$(COUNT - 1) S(COUNT) = S(COUNT - 1) NEXT COUNT END SUB SUB NotComplete LINE (0, 0)-(640, 350), 1, BF DRAW "BM125,133 C4 ND55 R388 D55 NL388 BH P4,4 BF C8 NL387 U55 C12 L388 D55" COLOR 14, 4 LOCATE 11, 18: PRINT "Sorry! You'll have to complete the game first." LOCATE 13, 24: PRINT "Press ENTER to return to the menu." t = TIMER DO: LOOP UNTIL INKEY$ = CHR$(13) OR TIMER - t > 5 COLOR 15, 0 END SUB SUB Options DO CALL Menu("Level", "Create Level", "Instructions", "Reset Game", "Back to Main Menu", sel) SELECT CASE sel CASE 1: CALL LevSel CASE 2: IF MAXLEV >= 15 THEN CALL LevelEdit ELSE CALL NotComplete CASE 3: CALL instructions(1) CASE 4: CALL ResetGame END SELECT LOOP UNTIL sel = 5 END SUB SUB pause (UNITS) FOR X = 1 TO SPEED * UNITS NEXT END SUB SUB ResetGame LINE (0, 0)-(640, 350), 1, BF COLOR 14, 4 DRAW "BM243,134 C4 ND60 R160 D60 NL160 BH P4,4 F C8 NL159 U60 C12 L160 D60" DRAW "BM334,165 C12 ND20 R35 C8 D20 NL35" POSS = 2 COLOR 14 LOCATE 11, 35: PRINT "ARE YOU SURE?" COLOR 5 LOCATE 13, 36: PRINT "YES" COLOR 10 LOCATE 13, 44: PRINT "NO" DO SELECT CASE INKEY$ CASE IS = CHR$(0) + "K": POSS = 1: COLOR 10: LOCATE 13, 36: PRINT "YES": COLOR 5: LOCATE 13, 44: PRINT "NO": DRAW "BM274,165 C12 ND20 R35 C8 D20 NL35 BM334,165 C4 ND20 R35 D20 NL35" CASE IS = CHR$(0) + "M": POSS = 2: COLOR 10: LOCATE 13, 44: PRINT "NO": COLOR 5: LOCATE 13, 36: PRINT "YES": DRAW "BM334,165 C12 ND20 R35 C8 D20 NL35 BM274,165 C4 ND20 R35 D20 NL35" CASE IS = CHR$(13): EXIT DO CASE IS = CHR$(27): END END SELECT LOOP IF POSS = 1 THEN MAXLEV = 1 LEVEL = 0 FOR COUNT = 1 TO 10 N$(COUNT) = " " S(COUNT) = 0 NEXT OPEN "C:GAME0584.INI" FOR RANDOM AS #1 LEN = 244 DATA$ = "01" FOR COUNT = 1 TO 10 DATA$ = DATA$ + " " NEXT COUNT DATA$ = DATA$ + "000000000000000000000000000000000000000000000000000000000000" FOR COUNT = 1 TO 242 BYTE$ = CHR$(ASC(MID$(DATA$, COUNT, 1)) - 30) PUT #1, COUNT, BYTE$ NEXT COUNT CLOSE #1 OPEN "C:LEVELS.DAT" FOR BINARY AS #1 X$ = " " SEEK #1, 1 FOR COUNT = 1 TO 10 PUT #1, COUNT, X$ NEXT COUNT CLOSE END IF END SUB SUB Save (speedlevel, StartposX, Startposy, Direction$, Counters) DIM LEVEL$(1 TO 62, 1 TO 32) FOR Y = 1 TO 32 FOR X = 1 TO 62 LEVEL$(X, Y) = CHR$(POINT(10 * X, 10 * Y + 11) + 32) NEXT X NEXT Y LINE (0, 0)-(640, 350), 1, BF OPEN "C:LEVELS.DAT" FOR BINARY AS #1 L$ = "S": CALL SlotChoose(slot, L$) IF slot <= 9 THEN U$ = "U": PUT #1, slot + 1, U$ SEEK #1, slot * 1989 + 11 Char$ = CHR$(speedlevel): PUT #1, , Char$ Char$ = CHR$(StartposX): PUT #1, , Char$ Char$ = CHR$(Startposy): PUT #1, , Char$ PUT #1, , Direction$ Char$ = CHR$(Counters): PUT #1, , Char$ FOR Y = 1 TO 32 FOR X = 1 TO 62 PUT #1, , LEVEL$(X, Y) NEXT X NEXT Y END IF CLOSE COLOR 15, 0 CALL ClsScreen LOCATE 1, 1: PRINT "<> <> <> <> <> <>" FOR Y = 1 TO 32 FOR X = 1 TO 62 ColourPixel = ASC(LEVEL$(X, Y)) - 32 LINE (10 * X, 10 * Y + 11)-(10 * X + 9, 10 * Y + 20), ColourPixel, BF NEXT X NEXT Y END SUB SUB ScoreMode DO DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 31) + 3) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 LINE (CX, CY)-(CX + 9, CY + 9), 10, BF LOCATE 1, 1: PRINT "SCORE: 0 " SCORE = 0 Btime = TIMER X = 310: Y = 161: AY = 10: AX = 0: LENGTH = 3 FOR c = 3 TO 1985 X(c) = 0: Y(c) = 0 NEXT c DO CALL pause(3) SELECT CASE INKEY$ CASE IS = CHR$(0) + "P": IF AY = 0 THEN AY = 10: AX = 0 CASE IS = CHR$(0) + "H": IF AY = 0 THEN AY = -10: AX = 0 CASE IS = CHR$(0) + "M": IF AX = 0 THEN AX = 10: AY = 0 CASE IS = CHR$(0) + "K": IF AX = 0 THEN AX = -10: AY = 0 CASE IS = CHR$(13): EXIT DO CASE IS = CHR$(32): PLAY "O5 L30 C" t = TIMER LOCATE 1, 33: PRINT "<<< PAUSED >>>" DO: SELECT CASE INKEY$ CASE IS = CHR$(27): END CASE IS = CHR$(32): EXIT DO END SELECT: LOOP LOCATE 1, 33: PRINT " " Btime = Btime + (TIMER - t) PLAY "O5 L30 C" CASE IS = CHR$(27): END END SELECT X = X + AX Y = Y + AY IF POINT(X + 5, Y + 5) = 10 THEN PLAY "O4L20G" SCORE = SCORE + 1 BONUS = INT((1 / (TIMER - Btime + 1D-99)) * 10) SCORE = SCORE + BONUS LOCATE 1, 1: PRINT "SCORE:"; SCORE LENGTH = LENGTH + 4 DO CX = (INT(RND * 62) + 1) * 10 CY = (INT(RND * 32) + 2) * 10 + 1 LOOP UNTIL POINT(CX, CY) = 1 AND (CX <> X(LENGTH) AND CY <> Y(LENGTH)) Btime = TIMER LINE (CX, CY)-(CX + 9, CY + 9), 10, BF END IF IF POINT(X + 5, Y + 5) = 12 OR POINT(X + 5, Y + 5) = 14 THEN PLAY "O0L10G" LOCATE 1, 32: PRINT "<<< YOU DIED! >>>" CALL AwaitKey EXIT DO ELSE LINE (X, Y)-(X + 9, Y + 9), 14, BF FOR c = LENGTH TO 2 STEP -1 X(c) = X(c - 1) Y(c) = Y(c - 1) NEXT X(1) = X: Y(1) = Y IF POINT(X(LENGTH), Y(LENGTH)) = 14 THEN LINE (X(LENGTH), Y(LENGTH))-(X(LENGTH) + 9, Y(LENGTH) + 9), 1, BF END IF END IF LOOP IF SCORE > S(10) THEN CALL NewScore PAINT (1, 1), 12 LINE (10, 21)-(629, 340), 1, BF CALL Choose(CHOICE) LOOP UNTIL CHOICE = 1 END SUB SUB SlotChoose (slot, L$) savedd$ = " " SEEK #1, 1 DIM saved$(0 TO 10) FOR COUNT = 0 TO 9 GET #1, COUNT + 1, savedd$ IF savedd$ = "U" THEN saved$(COUNT) = "USED " ELSE saved$(COUNT) = "EMPTY" NEXT COUNT DRAW "BM240,80 C4 ND175 R160 D175 NL160 BH P4,4 F C8 NL159 U175 C12 L160 D175" COLOR 14, 4 LOCATE 7, 34: PRINT saved$(0); " SLOT 0" COLOR 5 FOR COUNT = 1 TO 9 LOCATE 7 + COUNT, 34: PRINT saved$(COUNT); " SLOT "; COUNT NEXT COUNT LOCATE 18, 38: PRINT "CANCEL" slot = 0 DO DO SELECT CASE INKEY$ CASE CHR$(0) + "P": IF slot < 10 THEN slot = slot + 1 ELSE slot = 0 EXIT DO CASE CHR$(0) + "H": IF slot > 0 THEN slot = slot - 1 ELSE slot = 10 EXIT DO CASE CHR$(13): IF L$ = "S" THEN ENTER = 1 EXIT DO ELSE IF saved$(slot) = "USED " OR slot = 10 THEN ENTER = 1: EXIT DO END IF CASE CHR$(27): END END SELECT LOOP COLOR 5 FOR COUNT = 0 TO 9 LOCATE 7 + COUNT, 34: PRINT saved$(COUNT); " SLOT "; COUNT NEXT COUNT LOCATE 18, 38: PRINT "CANCEL" COLOR 14: IF slot <= 9 THEN LOCATE slot + 7, 34: PRINT saved$(slot); " SLOT "; slot ELSE LOCATE 18, 38: PRINT "CANCEL" LOOP UNTIL ENTER = 1 END SUB