'=========================================================================== ' Subject: MINESWEEPER W/MOUSE CONTROL Date: 04-16-97 (20:31) ' Author: David Joffe Code: QB, PDS ' Origin: Dj1@pixie.co.za Packet: GAMES.ABC '=========================================================================== '/=========================================================\` ' Minesweeper for DOS (C) David Joffe (1993) ` ' { QuickBASIC 4.5 : "QB /L" } dj1@pixie.co.za ` ' http://www.geocities.com/SoHo/Lofts/2018/ ` ' ` ' I wrote this program back when I was in high school. ` ' At that stage I had been programming less than a year, ` ' and the inexperience shows here. That is to say, the ` ' program is an uncommented mess of spaghetti code :-). ` ' Still, I thought some people might find this useful, ` ' fun or inspiring (I hope :) ` ' ' ' I have quite long since moved on to more advanced and ` ' professional programming, but I think I had the most ` ' programming fun during my BASIC programming days :-). ` ' - David, (March 1997) ` '-----------------------------------------------------------' ' Note: [April 1997] I'm adding some comments :) ' '-----------------------------------------------------------' ' Another note: [Later in April 1997] ' ' I've modified the program so that it can run under QB4.5.' ' Now it won't work on PDS 7.1! Oh well. The PDS version ' ' will be available at my webpage. ' '-----------------------------------------------------------' ' Oh yes; my best time is 8 seconds :) ' ' For simplicity's sake I won't distribute the high score ' ' file. The program will create a default one. ' '\=========================================================/` '=== Set default data type to integer for fastest processing DEFINT A-Z '=== Functions '=== Draw a 3D-looking rectangle on the screen, I think DECLARE SUB BoxDraw (x1, y1, x2, y2, status, height) '=== Turn mouse cursor on DECLARE SUB mon () '=== Turn mouse cursor off DECLARE SUB moff () '=== First-time-round comments :) '93/04/18 Mine-sweeper! '$INCLUDE: 'QB.BI' '=== Initialize the random number generator with the value of TIMER RANDOMIZE TIMER '=== Allocate arrays DIM SHARED m AS RegTypeX DIM grid(9, 9), status(9, 9) DIM pics(1 TO 600), Bugle(1 TO 130), digits(1 TO 1000), sun(1 TO 800) DIM Quit(1 TO 130), About(1 TO 130), temp(1 TO 6000), YesNo(1 TO 130) DIM ok(1 TO 40), numbers(1 TO 1200), bombs(700), fillx(100), filly(100) DIM ClearX(8), ClearY(8), nxt(1 TO 40), prev(1 TO 40) '=== Determine if mouse driver is present CALL INTERRUPTX(&H33, m, m) IF NOT m.ax THEN PRINT "No Microsoft Compatible Mouse Driver detected." END END IF '=== Initialize screen (320x200x16) ' The ON ERROR handler will be used if the person's hardware setup ' is not capable of this mode ON ERROR GOTO NoEGA SCREEN 7: CLS ON ERROR GOTO 0 '=== Load high-score list ' Creates default one if one not found 'IF DIR$("mines.his") = "" THEN GOSUB MakeNewFile ON ERROR GOTO HighScoreFileNotFound OPEN "mines.his" FOR INPUT AS #1 CLOSE ON ERROR GOTO 0 OPEN "r", #1, "mines.his", 16 FIELD #1, 16 AS score$ GET #1, 1 Num$ = RTRIM$(LTRIM$(STR$(CVI(RIGHT$(score$, 2))))) sname$ = LEFT$(score$, 14): score$ = SPACE$(3 - (LEN(Num$))) + Num$ score = VAL(score$) CLOSE GOTO PastNoFileErrorHandling HighScoreFileNotFound: CLOSE GOSUB MakeNewFile RESUME NEXT PastNoFileErrorHandling: '=== Read graphics PUT image data FOR i = 1 TO 106: READ Bugle(i): NEXT i FOR i = 1 TO 107: READ About(i): NEXT i FOR i = 1 TO 121: READ Quit(i): NEXT i FOR i = 1 TO 105: READ YesNo(i): NEXT i FOR i = 1 TO 700: READ digits(i): NEXT i FOR i = 1 TO 594: READ pics(i): NEXT i FOR i = 1 TO 29: READ ok(i): NEXT i FOR i = 1 TO 989: READ numbers(i): NEXT i FOR i = 1 TO 733: READ sun(i): NEXT i FOR i = 1 TO 8: READ ClearX(i), ClearY(i): NEXT i FOR i = 1 TO 21: READ nxt(i): NEXT i FOR i = 1 TO 21: READ prev(i): NEXT i '=== Draw the screen LINE (0, 0)-(319, 199), 7, BF BoxDraw 0, 0, 319, 199, 1, 3 BoxDraw 13, 12, 306, 27, 0, 3 LINE (16, 15)-(303, 15), 0 LINE (16, 24)-(303, 24), 0 BoxDraw 13, 41, 146, 174, 0, 3 BoxDraw 159, 41, 306, 78, 0, 3 BoxDraw 159, 87, 306, 174, 0, 3 BoxDraw 167, 93, 298, 142, 1, 3 LINE (182, 102)-(281, 113), 0, BF BoxDraw 182, 102, 281, 113, 0, 1 COLOR 10: LOCATE 14, 24: PRINT "Best Time:" BoxDraw 172, 117, 291, 130, 1, 2 BoxDraw 212, 125, 243, 138, 1, 2 LINE (174, 119)-(289, 128), 0, BF LINE (214, 127)-(241, 136), 0, BF PSET (212, 129), 8 COLOR 12: LOCATE 16, 23: PRINT sname$ COLOR 9: LOCATE 17, 28: PRINT score$ PUT (267, 151), Bugle, PSET PUT (171, 151), Quit, PSET PUT (219, 151), About, PSET BoxDraw 263, 147, 298, 169, 1, 3 BoxDraw 215, 147, 250, 169, 1, 3 BoxDraw 167, 147, 202, 169, 1, 3 BoxDraw 220, 47, 245, 72, 1, 3 LINE (174, 50)-(207, 69), 0, BF BoxDraw 174, 50, 207, 69, 0, 1 LINE (258, 50)-(291, 69), 0, BF BoxDraw 258, 50, 291, 69, 0, 1 COLOR 13 ' 13=Purple LOCATE 3, 3: PRINT " --- MineSweeper --- " PUT (223, 50), sun, PSET '=== Initialize grid data GOSUB ClearTheGrid '=== Turn mouse cursor display on mon '********************************************* [BEGIN: MAIN LOOP ] *** ' Game: zt$ = TIME$ GameLoop: IF move = 2 THEN GOSUB TimeCheck GOSUB RegularCheck GOSUB MouseCheck GOTO GameLoop '*********************************************** [END: MAIN LOOP ] *** '=== Get mouse button-press and screen position data MGet: m.ax = 3: CALL INTERRUPTX(&H33, m, m) x = m.cx: y = m.dx '=== The value of "ax" and "ay" are integer values that, if the ' mouse is somewhere in the grid, will hold values from 1 up ' to 8. I.e., this is the integer index to the grid array ax = (x - 29) \ 32 + 1 ay = (y - 43) \ 16 + 1 IF x <= 28 THEN ax = 0 IF y <= 42 THEN ay = 0 RETURN '=== Routine to perform a delay. Delay: '=== This IF condition is here to prevent the unlikely event of the Delay ' subroutine looping forever if it happens to be called as midnight ' ticks over; (or something like that) IF TIMER > 86398 THEN LessThan10: IF TIMER > 10 THEN GOTO LessThan10 ELSE s! = TIMER + .5 sf: f! = TIMER: IF f! < s! THEN GOTO sf END IF RETURN '=== Wait for the user to let go of all mouse buttons ' I suppose it should use a WHILE .. WEND WaitForRelease: GOSUB MGet IF m.bx <> 0 THEN GOTO WaitForRelease RETURN '=== Check various keyboard and button inputs RegularCheck: '=== CHR$(27) is the ESC key IF INKEY$ = CHR$(27) THEN GOSUB RoutineForQuit GOSUB MGet '=== No mouse buttons down IF m.bx = 0 THEN RETURN '=== Clicked on the sun, for new game IF x >= 444 AND x <= 480 AND y >= 49 AND y <= 68 THEN GOTO NewGame '=== Check for any of the three major buttons IF y >= 150 AND y <= 164 THEN '=== Bugle button IF x >= 532 AND x <= 584 THEN moff BoxDraw 263, 147, 298, 169, 0, 3 mon PLAY "O1L3D" GOSUB Delay: moff: BoxDraw 263, 147, 298, 169, 1, 3: mon END IF '=== Quit button IF x >= 340 AND x <= 392 THEN GOSUB RoutineForQuit '=== Help button IF x >= 434 AND x <= 488 THEN GOSUB AboutRoutine END IF RETURN MouseCheck: '=== Get mouse info GOSUB MGet '=== If you're pressing right mouse button and you're in the grid IF ax <= 8 AND ax >= 1 AND ay >= 1 AND ay <= 8 AND m.bx = 2 THEN IF status(ax, ay) = 1 THEN RETURN IF status(ax, ay) = 0 THEN status(ax, ay) = 2: Num = 1: GOTO Label6 IF status(ax, ay) = 2 THEN status(ax, ay) = 3: Num = 2: GOTO Label6 IF status(ax, ay) = 3 THEN status(ax, ay) = 0: Num = 0 Label6: '=== Calculate number of bombs unmarked, to show on the LED display numbombs = 10 FOR i = 1 TO 8 FOR j = 1 TO 8 IF status(i, j) = 2 THEN numbombs = numbombs - 1 NEXT j, i moff numbombs$ = RTRIM$(LTRIM$(STR$(numbombs))) IF numbombs < 0 THEN digitnum$ = RIGHT$(numbombs$, LEN(numbombs$) - 1) IF numbombs < 0 THEN numbombs$ = "-" + STRING$(2 - (LEN(digitnum$)), "0") + digitnum$ ELSE numbombs$ = STRING$(3 - (LEN(numbombs$)), "0") + numbombs$ FOR i = 1 TO 3 '=== If number is negative IF MID$(numbombs$, i, 1) = "-" THEN NumB = 681 ELSE NumB = VAL(MID$(numbombs$, i, 1)) * 68 + 1 END IF PUT (i * 10 + 167, 52), digits(NumB), PSET NEXT i IF Num = 0 THEN LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 7, BF BoxDraw ((ax - 1) * 16 + 16), (ay - 1) * 16 + 44, (ax - 1) * 16 + 31, (ay - 1) * 16 + 59, 1, 2 mon GOSUB WaitForRelease: RETURN END IF PUT ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44), pics((Num - 1) * 132 + 1), PSET mon GOSUB WaitForRelease END IF '=== If you're pressing left mouse button and you're in the grid IF ax <= 8 AND ax >= 1 AND ay >= 1 AND ay <= 8 AND m.bx = 1 THEN PUT (223, 50), sun(205), PSET IF status(ax, ay) = 0 THEN moff LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 7, BF mon END IF WaitReleaseLoop: tax = ax: tay = ay GOSUB MGet IF ax <> tax OR ay <> tay THEN GOSUB RestoreOld: GOSUB DrawNew IF move = 2 THEN GOSUB TimeCheck IF m.bx = 0 THEN GOTO Reveal GOTO WaitReleaseLoop Reveal: moff PUT (223, 50), sun, PSET mon IF ax > 8 OR ax < 1 OR ay > 8 OR ay < 1 THEN GOSUB RestoreOld: RETURN IF status(ax, ay) <> 0 THEN GOSUB RestoreOld: RETURN IF grid(ax, ay) = -1 THEN IF move = 1 THEN Lebel: num1 = INT(RND * 8) + 1: num2 = INT(RND * 8) + 1 IF grid(num1, num2) = -1 THEN GOTO Lebel grid(num1, num2) = -1: grid(ax, ay) = 0 GOSUB InitNums GOTO Labal END IF moff PUT ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44), pics(3 * 132 + 1), PSET FOR i = 1 TO 8 FOR j = 1 TO 8 IF i = ax AND j = ay THEN GOTO LabelG IF grid(i, j) <> -1 AND status(i, j) = 2 THEN PUT ((i - 1) * 16 + 16, (j - 1) * 16 + 44), pics(4 * 132 + 1), PSET IF grid(i, j) = -1 THEN PUT ((i - 1) * 16 + 16, (j - 1) * 16 + 44), pics(2 * 132 + 1), PSET LabelG: NEXT j, i PUT (223, 50), sun(613), PSET mon PLAY "o1l64dcco0bgfcgdfcdcedcecdcfcgecdccdc" GOTO DeadLoop END IF Labal: moff LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 7, BF IF grid(ax, ay) <> 0 THEN PUT ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44), numbers((grid(ax, ay) - 1) * 132 + 1), PSET LINE ((ax - 1) * 16 + 31, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 8 LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 59)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 8 IF grid(ax, ay) = 0 THEN GOSUB FillArea mon status(ax, ay) = 1: move = 2 count = 0 FOR i = 1 TO 8 FOR j = 1 TO 8 IF grid(i, j) <> -1 AND status(i, j) = 1 THEN count = count + 1 NEXT j, i IF count = 54 THEN GOTO YouHaveWon END IF RETURN RestoreOld: IF tax > 8 OR tax < 1 OR tay < 1 OR tay > 8 THEN RETURN IF status(tax, tay) <> 0 THEN RETURN moff BoxDraw ((tax - 1) * 16 + 16), (tay - 1) * 16 + 44, (tax - 1) * 16 + 31, (tay - 1) * 16 + 59, 1, 2 mon RETURN DrawNew: IF ax > 8 OR ax < 1 OR ay < 1 OR ay > 8 THEN RETURN IF status(ax, ay) <> 0 THEN RETURN moff LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 7, BF mon RETURN RoutineForQuit: '=== Show button press action moff BoxDraw 167, 147, 202, 169, 0, 3 mon GOSUB Delay moff BoxDraw 167, 147, 202, 169, 1, 3 '=== Draw "Are you sure" dialog GET (111, 74)-(201, 111), temp LINE (111, 74)-(201, 111), 7, BF BoxDraw 111, 74, 201, 111, 1, 3 COLOR 12: LOCATE 11, 17: PRINT " Quit? " BoxDraw 127, 79, 184, 88, 0, 1 BoxDraw 128, 94, 148, 104, 1, 1 BoxDraw 163, 94, 183, 104, 1, 1 PUT (130, 96), YesNo, PSET PUT (165, 96), YesNo(68), PSET mon QuitLoop: a$ = UCASE$(INKEY$) GOSUB MGet IF move = 2 THEN GOSUB TimeCheck IF (x >= 256 AND x <= 290 AND y >= 94 AND y <= 102 AND m.bx <> 0) OR (a$ = "Y") THEN moff BoxDraw 128, 94, 148, 104, 0, 1: mon: GOSUB Delay: moff SCREEN 0: WIDTH 80, 25: CLS : COLOR 15, 1 PRINT "ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ" PRINT "Û "; : COLOR 14, 0: PRINT "ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "ÛßßßßßßßßßßßßßßÛ"; : COLOR 13, 0: PRINT " Û²±° Thank you for playing °±²Û "; : COLOR 14, 0: PRINT "ÛßßßßßßßßßßßÛ"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "Û ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ Û"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "Û"; : COLOR 12, 0: PRINT " ÒÄÒÄÒ þ ÖÄÄÄ· "; : COLOR 14, 0: PRINT "Û"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "Û"; : COLOR 12, 0: PRINT " ÜÜ º Ð º · ÒÄÒ ÖÄ· ÓÄÄÄ· Ò Ò ÖÄ· ÖÄ· ÒÄ· ÖÄ· ÒÄ· ÜÜ "; : COLOR 14, 0: PRINT "Û"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "Û"; : COLOR 12, 0: PRINT " ßß Ð Ð Ð Ð Ð ÓÄ ÓÄÄĽ ÓÄÐĽ ÓÄ ÓÄ ÇĽ ÓÄ Ð ßß "; : COLOR 14, 0: PRINT "Û"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "Û"; : COLOR 12, 0: PRINT " for DOS Ð "; : COLOR 14, 0: PRINT "Û"; : COLOR 15, 1: PRINT " Û" PRINT "Û "; : COLOR 14, 0: PRINT "ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ"; : COLOR 15, 1: PRINT " Û" PRINT "Û Û" PRINT "Û This program is Public Domain Software, so feel free to distribute it. Û" PRINT "Û Please send me any comments or suggestions you may have. If you find any Û" PRINT "Û errors then please tell me about them. If you found that you really Û" PRINT "Û enjoyed this game then feel free to send me a donation. Û" PRINT "Û Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " David Joffe, "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " e-mail: dj1@pixie.co.za Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " DJ Software, "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " www.geocities.com/SoHo/Lofts/2018/ Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " My address was in "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " this box, please "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " Û"; : COLOR 13, 0: PRINT "ßßßßßßßßßßßßßßßßßß"; : COLOR 15, 1: PRINT "Û Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " e-mail me for "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " Û"; : COLOR 12, 0: PRINT " Goodbye! "; : COLOR 15, 1: PRINT "Û Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " snail-mail contact "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " Û"; : COLOR 13, 0: PRINT "ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ"; : COLOR 15, 1: PRINT "Û Û" PRINT "Û "; : COLOR 1, 0: PRINT "²²±±°°"; : COLOR 14, 0: PRINT " info. "; : COLOR 1: PRINT "°°±±²²"; : COLOR 15, 1: PRINT " ßßßßßßßßßßßßßßßßßßßß Û" PRINT "ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ" END END IF IF (x >= 326 AND x <= 362 AND y >= 94 AND y <= 102 AND m.bx <> 0) OR (a$ = "N") THEN moff BoxDraw 163, 94, 183, 104, 0, 1: mon GOSUB Delay: moff PUT (111, 74), temp, PSET: mon RETURN END IF GOTO QuitLoop '=== Routine for handling the Help Screens AboutRoutine: '=== Show "?" button press action (I think) moff BoxDraw 215, 147, 250, 169, 0, 3 mon GOSUB Delay moff BoxDraw 215, 147, 250, 169, 1, 3 '=== Store what's under this area of screen in the array "temp" GET (159, 41)-(306, 174), temp LINE (159, 41)-(306, 174), 7, BF BoxDraw 164, 41, 306, 174, 1, 3 LINE (170, 47)-(300, 168), 0, BF BoxDraw 170, 47, 300, 168, 0, 1 COLOR 12 LOCATE 7, 23: PRINT "---------------" GOSUB Page1 COLOR 12 LOCATE 21, 23: PRINT "---------------" LINE (197, 140)-(273, 158), 7, BF BoxDraw 197, 140, 273, 158, 1, 2 BoxDraw 207, 145, 221, 153, 1, 1 PUT (210, 147), ok, PSET BoxDraw 252, 145, 264, 153, 1, 1 PUT (254, 147), nxt, PSET LINE (234, 145)-(246, 153), 8, B PUT (236, 147), prev, PSET mon Page = 1 Label: a$ = INKEY$ IF a$ <> "" THEN GOTO QuitRoute abouttrue = 1 IF move = 2 THEN GOSUB TimeCheck abouttrue = 0 GOSUB MGet IF m.bx = 0 THEN GOTO Label IF x >= 414 AND y >= 145 AND x <= 438 AND y <= 151 THEN QuitRoute: moff BoxDraw 207, 145, 221, 153, 0, 1 mon GOSUB Delay moff PUT (159, 41), temp, PSET mon RETURN END IF '=== This is if the user goes one screen forward IF x >= 504 AND y >= 145 AND x <= 524 AND y <= 151 AND Page <> 13 THEN moff BoxDraw 252, 145, 264, 153, 0, 1 mon GOSUB Delay Page = Page + 1 IF Page > 13 THEN Page = 13 moff COLOR 15 '=== Show relevant screen ON Page GOSUB Page1, Page2, Page3, Page4, Page5, Page6, Page7, Page8, Page9, Page10, Page11, Page12, Page13 IF Page <> 13 THEN BoxDraw 252, 145, 264, 153, 1, 1 ELSE LINE (252, 145)-(264, 153), 8, B IF Page = 2 THEN BoxDraw 234, 145, 246, 153, 1, 1 mon END IF '=== This is if the user goes one screen backward. This could have ' been merged relatively effectively with the IF..ENDIF block just ' above, but I guess this is my beginner-ness showing through IF x >= 468 AND y >= 145 AND x <= 488 AND y <= 151 AND Page <> 1 THEN moff BoxDraw 234, 145, 246, 153, 0, 1 mon GOSUB Delay Page = Page - 1 '=== More beginnerness showing through: Note the condition for ' this block's IF. It already checks "Page <> 1", ' so the following condition should never become true IF Page < 1 THEN Page = 1 moff COLOR 15 '=== Show relevant screen ON Page GOSUB Page1, Page2, Page3, Page4, Page5, Page6, Page7, Page8, Page9, Page10, Page11, Page12, Page13 IF Page <> 1 THEN BoxDraw 234, 145, 246, 153, 1, 1 ELSE LINE (234, 145)-(246, 153), 8, B IF Page = 12 THEN BoxDraw 252, 145, 264, 153, 1, 1 mon END IF GOTO Label '=== The Help Screens Page1: COLOR 11 LOCATE 8, 23: PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ": COLOR 15 LOCATE , 23: PRINT "ßßßßßßßßßßßßßßß": COLOR 9 LOCATE , 23: PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿" LOCATE , 23: PRINT "³ "; : COLOR 10: PRINT "MineSweeper"; : COLOR 9: PRINT " ³": COLOR 9 LOCATE , 23: PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ": COLOR 14 LOCATE , 23: PRINT " * for DOS * ": COLOR 15 LOCATE , 23: PRINT "ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ": COLOR 11 LOCATE , 23: PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ": COLOR 9 LOCATE , 23: PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ": COLOR 1 LOCATE , 23: PRINT "ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ" RETURN Page2: COLOR 14 LOCATE 8, 23: PRINT "ßßßßßßßßßßßßßßß": COLOR 11 LOCATE , 23: PRINT "Windows version": COLOR 15 LOCATE , 23: PRINT " Robert Donner " LOCATE , 23: PRINT "& Curt Johnson" LOCATE , 23: PRINT " ": COLOR 11 LOCATE , 23: PRINT "DOS version by:": COLOR 15 LOCATE , 23: PRINT " David Joffe ": COLOR 14 LOCATE , 23: PRINT "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ": COLOR 13 LOCATE , 23: PRINT " DJ - Software ": COLOR 14 LOCATE , 23: PRINT "ÜÜÜÜÜÜÜÜ "; : COLOR 13: PRINT "1993 "; : COLOR 14: PRINT "Ü" RETURN Page3: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT " In the grid " LOCATE , 23: PRINT "to your left " LOCATE , 23: PRINT "are hidden ten " LOCATE , 23: PRINT "bombs. ": COLOR 10 LOCATE , 23: PRINT " The aim is " LOCATE , 23: PRINT "to find out the" LOCATE , 23: PRINT "location of all" LOCATE , 23: PRINT "ten bombs. " GOSUB Prnt RETURN Page4: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT " To reveal " LOCATE , 23: PRINT "what is hidden " LOCATE , 23: PRINT "under a block, " LOCATE , 23: PRINT "click on it " LOCATE , 23: PRINT "with the left " LOCATE , 23: PRINT "mouse button. ": COLOR 10 LOCATE , 23: PRINT " If it is a " LOCATE , 23: PRINT "bomb then -" GOSUB Prnt RETURN Page5: GOSUB Print8 COLOR 10 LOCATE , 23: PRINT "you are dead, " LOCATE , 23: PRINT "& the locations" LOCATE , 23: PRINT "of all ten of " LOCATE , 23: PRINT "the bombs will " LOCATE , 23: PRINT "be revealed. ": COLOR 11 LOCATE , 23: PRINT " " LOCATE , 23: PRINT " If it is not" LOCATE , 23: PRINT "a bomb, then -" GOSUB Prnt RETURN Page6: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT "a number will " LOCATE , 23: PRINT "appear which is" LOCATE , 23: PRINT "the number of " LOCATE , 23: PRINT "bombs in the " LOCATE , 23: PRINT "surrounding " LOCATE , 23: PRINT "eight squares. ": COLOR 10 LOCATE , 23: PRINT " If there are" LOCATE , 23: PRINT "no bombs in -" GOSUB Prnt RETURN Page7: GOSUB Print8 COLOR 10 LOCATE , 23: PRINT "the surrounding" LOCATE , 23: PRINT "eight squares " LOCATE , 23: PRINT "then a blank " LOCATE , 23: PRINT "will appear and" LOCATE , 23: PRINT "any surrounding" LOCATE , 23: PRINT "blanks will be " LOCATE , 23: PRINT "cleared auto- " LOCATE , 23: PRINT "matically. " GOSUB Prnt RETURN Page8: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT " If you would" LOCATE , 23: PRINT "like to mark a " LOCATE , 23: PRINT "block that you " LOCATE , 23: PRINT "know has a bomb" LOCATE , 23: PRINT "underneath it, " LOCATE , 23: PRINT "click on it " LOCATE , 23: PRINT "with the right " LOCATE , 23: PRINT "mouse button. " GOSUB Prnt RETURN Page9: GOSUB Print8 COLOR 10 LOCATE , 23: PRINT " The digital " LOCATE , 23: PRINT "display on the " LOCATE , 23: PRINT "left, which " LOCATE , 23: PRINT "tells you how " LOCATE , 23: PRINT "many bombs you " LOCATE , 23: PRINT "have left, will" LOCATE , 23: PRINT "then decrease " LOCATE , 23: PRINT "by one. " GOSUB Prnt RETURN Page10: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT " If you are " LOCATE , 23: PRINT "uncertain about" LOCATE , 23: PRINT "whether or not " LOCATE , 23: PRINT "a certain block" LOCATE , 23: PRINT "has a bomb then" LOCATE , 23: PRINT "click the right" LOCATE , 23: PRINT "mouse button on" LOCATE , 23: PRINT "it twice to -" GOSUB Prnt RETURN Page11: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT "mark it with a " LOCATE , 23: PRINT "question mark. " LOCATE , 23: PRINT " ": COLOR 10 LOCATE , 23: PRINT " To make a " LOCATE , 23: PRINT "beeping noise, " LOCATE , 23: PRINT "click on the " LOCATE , 23: PRINT "bugle icon. " LOCATE , 23: PRINT " " GOSUB Prnt RETURN Page12: GOSUB Print8 COLOR 11 LOCATE , 23: PRINT " To start a " LOCATE , 23: PRINT "new game, click" LOCATE , 23: PRINT "on the yellow " LOCATE , 23: PRINT "face. ": COLOR 10 LOCATE , 23: PRINT " Your game is" LOCATE , 23: PRINT "timed and the " LOCATE , 23: PRINT "fastest time is" LOCATE , 23: PRINT "stored. " GOSUB Prnt RETURN Page13: GOSUB Print8 COLOR 15 LOCATE , 23: PRINT " This program " LOCATE , 23: PRINT "was written in " LOCATE , 23: PRINT "Microsoft " LOCATE , 23: PRINT "QuickBASIC 7.1 " LOCATE , 23: PRINT " ": COLOR 14 LOCATE , 23: PRINT " Enjoy! " LOCATE , 23: PRINT " ": COLOR 11 LOCATE , 23: PRINT " - David Joffe" GOSUB Prnt RETURN '=== For the above Help Screens, this draws the pretty colorful stripes ' *above* the text. Not sure why I called it Print8 Print8: LOCATE 8, 23 COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í"; COLOR 14: PRINT "Í"; : COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; COLOR 12: PRINT "Í"; : COLOR 14: PRINT "Í"; : COLOR 12: PRINT "Í"; COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í"; : COLOR 14: PRINT "Í"; COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í" RETURN '=== For the above Help Screens, this draws the pretty colorful stripes ' *below* the text. Not sure why I called it Prnt Prnt: LOCATE , 23 COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í"; COLOR 14: PRINT "Í"; : COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; COLOR 12: PRINT "Í"; : COLOR 14: PRINT "Í"; : COLOR 12: PRINT "Í"; COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í"; : COLOR 14: PRINT "Í"; COLOR 12: PRINT "Í"; : COLOR 4: PRINT "Í"; : COLOR 12: PRINT "Í" RETURN '=== Create a new high-score list with name "Anonymous" and score 999 MakeNewFile: OPEN "r", #1, "mines.his", 16 FIELD #1, 16 AS score$ LSET score$ = "Anonymous ç" + CHR$(3) PUT #1, 1 CLOSE RETURN ClearTheGrid: '=== Initialize variables for game countfill = 0 speed = -1 bombs = 10 move = 1 ERASE grid, status moff PUT (223, 50), sun, PSET PUT (177, 52), digits, PSET: PUT (187, 52), digits(69), PSET PUT (197, 52), digits, PSET: PUT (261, 52), digits, PSET PUT (271, 52), digits, PSET: PUT (281, 52), digits, PSET '=== Random the bomb positions FOR i = 1 TO 10 Label2: num1 = INT(RND * 8) + 1 num2 = INT(RND * 8) + 1 '=== If this position already a bomb, random another position IF grid(num1, num2) = -1 THEN GOTO Label2 grid(num1, num2) = -1 NEXT i '=== Fill in the bomb-count-of-surrounding-squares data GOSUB InitNums LINE (16, 44)-(143, 171), 7, BF '=== Draw the un-touched grid FOR i = 1 TO 8 FOR j = 1 TO 8 BoxDraw ((i - 1) * 16 + 16), (j - 1) * 16 + 44, (i - 1) * 16 + 31, (j - 1) * 16 + 59, 1, 2 NEXT j, i mon RETURN '=== Handler for if you don't have appropriate hardware NoEGA: SCREEN 0: WIDTH 80, 25: CLS PRINT "Sorry - you need an EGA or VGA adapter to play:-" PRINT " DJ - MineSweeper!" END '=== Using the grid with just knowledge of where the bombs are, ' generate the numbers that show how many bombs surround a square InitNums: FOR i = 1 TO 8 FOR j = 1 TO 8 Num = 0 IF grid(i, j) = -1 THEN GOTO Label3 FOR k = -1 TO 1 FOR l = -1 TO 1 IF k = 0 AND l = 0 THEN GOTO Label4 IF grid(i + k, j + l) = -1 THEN Num = Num + 1 Label4: NEXT l, k grid(i, j) = Num: Num = 0 Label3: NEXT j, i RETURN '=== You're dead! DeadLoop: move = 1 GOSUB RegularCheck GOTO DeadLoop TimeCheck: t$ = TIME$ IF t$ = zt$ THEN RETURN '=== Stop updating if person takes really long IF speed = 999 THEN RETURN zt$ = t$ speed = speed + 1: speed$ = RTRIM$(LTRIM$(STR$(speed))) speed$ = STRING$(3 - (LEN(speed$)), "0") + speed$ ' Draw LED display showing current time taken IF abouttrue <> 1 THEN moff FOR i = 1 TO 3 PUT (i * 10 + 251, 52), digits(VAL(MID$(speed$, i, 1)) * 68 + 1), PSET NEXT i mon END IF RETURN NewGame: '=== Draw button-press action moff BoxDraw 220, 47, 245, 72, 0, 3 mon GOSUB Delay moff BoxDraw 220, 47, 245, 72, 1, 3 mon '=== Initialize the grid data GOSUB ClearTheGrid GOTO Game '=== Routine for, er, well, if you win. YouHaveWon: moff ' Draw smiley face sun PUT (223, 50), sun(409), PSET PUT (177, 52), digits, PSET PUT (187, 52), digits, PSET PUT (197, 52), digits, PSET ' Show all bombs FOR i = 1 TO 8 FOR j = 1 TO 8 IF grid(i, j) = -1 THEN PUT ((i - 1) * 16 + 16, (j - 1) * 16 + 44), pics, PSET END IF NEXT j, i COLOR 12: LOCATE 16, 23: PRINT sname$ COLOR 9: LOCATE 17, 28: PRINT score$ IF speed < 0 THEN speed = 0 IF speed > score THEN mon: GOTO DeadLoop '=== If you got a high-score, prompt the user to enter his name: Num$ = RTRIM$(LTRIM$(STR$(speed))) score$ = SPACE$(3 - (LEN(Num$))) + Num$ LOCATE 17, 28: PRINT score$ COLOR 14: LOCATE 16, 23: PRINT "_ " sname$ = "" mon '=== Simple routine to get user input: GetNameLoop: a$ = INKEY$ IF LEN(a$) = 2 THEN GOTO GetNameLoop IF a$ = "" THEN GOTO GetNameLoop IF a$ = CHR$(8) THEN IF sname$ = "" THEN GOTO GetNameLoop ELSE sname$ = LEFT$(sname$, LEN(sname$) - 1): moff: LOCATE 16, 23: PRINT sname$ + "_ ": mon: GOTO GetNameLoop IF a$ = CHR$(13) THEN GOTO WriteName IF LEN(sname$) = 13 THEN GOTO GetNameLoop sname$ = sname$ + a$: moff: LOCATE 16, 23: PRINT sname$ + "_": mon GOTO GetNameLoop '=== Save high-score file with sname$ and the value in speed WriteName: OPEN "r", #1, "mines.his", 16 FIELD #1, 16 AS score$ LSET score$ = sname$ + STRING$(14 - LEN(sname$), 32) + MKI$(speed) PUT #1, 1 CLOSE ' Update the high-score on the screen moff COLOR 12: LOCATE 16, 23: PRINT sname$ + " " mon GOTO DeadLoop FillArea: fcount = 0: ERASE fillx, filly fillx(0) = ax: filly(0) = ay status(ax, ay) = 1 moff LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 31, (ay - 1) * 16 + 59), 8, B LINE ((ax - 1) * 16 + 16, (ay - 1) * 16 + 44)-((ax - 1) * 16 + 30, (ay - 1) * 16 + 58), 7, BF z = 0 FillLoop: FOR i = 1 TO 8 fx = fillx(z): fy = filly(z) fx = fx + ClearX(i): fy = fy + ClearY(i) IF fx < 1 OR fx > 8 OR fy < 1 OR fy > 8 THEN GOTO NextI IF grid(fx, fy) <> 0 THEN IF status(fx, fy) <> 2 THEN PUT ((fx - 1) * 16 + 16, (fy - 1) * 16 + 44), numbers((grid(fx, fy) - 1) * 132 + 1), PSET LINE ((fx - 1) * 16 + 31, (fy - 1) * 16 + 44)-((fx - 1) * 16 + 31, (fy - 1) * 16 + 59), 8 LINE ((fx - 1) * 16 + 16, (fy - 1) * 16 + 59)-((fx - 1) * 16 + 31, (fy - 1) * 16 + 59), 8 status(fx, fy) = 1 END IF GOTO NextI END IF FOR j = 1 TO fcount IF fx = fillx(j) AND fy = filly(j) THEN GOTO NextI NEXT j fcount = fcount + 1: fillx(fcount) = fx: filly(fcount) = fy NextI: NEXT i z = z + 1 IF z <= fcount THEN IF status(fillx(z), filly(z)) <> 2 THEN LINE ((fillx(z) - 1) * 16 + 16, (filly(z) - 1) * 16 + 44)-((fillx(z) - 1) * 16 + 31, (filly(z) - 1) * 16 + 59), 8, B LINE ((fillx(z) - 1) * 16 + 16, (filly(z) - 1) * 16 + 44)-((fillx(z) - 1) * 16 + 30, (filly(z) - 1) * 16 + 58), 7, BF status(fillx(z), filly(z)) = 1 END IF GOTO FillLoop END IF mon RETURN '=== Image data ' Created by a simple drawing program I wrote that can output in ' DATA format for images using PUT DATA 28,15,,,,,,,,,,,64,,64,,64,,,,96,,96,,96,,,,112 DATA ,112,,112,,,,124,8192,124,8192,124,8192,,,-129,-7937,-129,-7937 DATA -129,-7937,,,-129,-7937,-129,-7937,-129,-7937,,,-129,-7937,-129 DATA -7937,-129,-7937,,,-16260,8204,-16260,8204,-16260,8204,,,-32655 DATA 6,-32655,6,-32655,6,,,97,2,97,2,97,2,,,-32703,6,-32703,6,-32703 DATA 6,,,-256,252,-256,252,-256,252 DATA 28,15,,,,,,,,,-256,240,-256,240,,,-256,240,-255,248,1, DATA ,,-255,248,-253,252,2,,,,-16381,24,-16381,28,2,16,,,-32765 DATA 24,-16381,28,2,16,,,-32765,24,-16383,60,1,32,,,1,56,768,248,768 DATA 192,,,768,240,3840,240,3072,,,,3840,,3840,,2048,,,,2048 DATA ,,,,,,,,,3840,,3840,,,,3840,,7936,128,4096,,,,7936,,3840 DATA 28,15,,,,,,,,,,,,,-32705,,-32705,,,,,,-16288,,-16288 DATA ,,,,,-16288,,-16288,,,,,,-16288,6,-16288,6,,,,,-16288 DATA 6,-16288,6,,,,,-16288,54,-16288,54,,,,,-16288,-32713,-16288 DATA -32713,,,,,-16288,6,-16288,6,,,,,-9888,182,-9888,182,,, DATA ,-9888,182,-9888,182,,,,,-9886,24758,-9886,24758,,,,,-9887 DATA 24758,-9887,24758,,,,,-4289,-16333,-4289,-16333,,,,,12288,,12288 DATA 17,7,,,,,,,,17664,239,,17664,239,,17664,8,,17664,8,,32000 DATA 143,,32000,143,,4352,1,,4352,1,,4352,239,,4352,239,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,17,7,,,,,,, DATA 4352,56,,4352,56,,6400,68,,6400,68,,5376,68,,5376,68,,4864,68 DATA ,4864,68,,4352,56,,4352,56 DATA 8,16,,32382,,15420,,-32383,,-15421,,-15421,,-15421,,-32383 DATA ,,,,,-32383,,-15421,,-15421,,-15421,,-32383,,15420,,32382 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,8,16,,,,257,,771,,771,,771,,771,,257,,,,,,257,,771 DATA ,771,,771,,771,,257,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,8,16,,32382,,15420,,257,,771,,771 DATA ,771,,257,,31868,,15420,,-32640,,-16192,,-16192,,-16192, DATA -32640,,15420,,32382,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,8,16,,32382,,15420,,257,,771,,771,,771 DATA ,257,,31868,,15420,,257,,771,,771,,771,,257,,15420,,32382 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,8,16,,,,-32383,,-15421,,-15421,,-15421,,-15421,,-32383, DATA 31868,,15420,,257,,771,,771,,771,,771,,257,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,16,,32382 DATA ,15420,,-32640,,-16192,,-16192,,-16192,,-32640,,32382,,15420 DATA ,257,,771,,771,,771,,257,,15420,,32382,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,8,16,,,,-32640 DATA ,-16192,,-16192,,-16192,,-16192,,-32640,,15934,,15420,,-32383 DATA ,-15421,,-15421,,-15421,,-32383,,15420,,32382,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,8,16,,32382 DATA ,15420,,257,,771,,771,,771,,257,,,,,,257,,771,,771, DATA 771,,257,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,8,16,,32382,,15420,,-32383,,-15421,,-15421 DATA ,-15421,,-32383,,15934,,31868,,-32383,,-15421,,-15421,,-15421 DATA ,-32383,,15420,,32382,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,8,16,,32382,,15420,,-32383,,-15421, DATA -15421,,-15421,,-32383,,15934,,31868,,257,,771,,771,,771, DATA 257,,15420,,32382,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,8,16,,,,,,,,,,,,,,,,32382,,15420 DATA 16,16,-1,-1,-1,-1,-257,-257,-257,-1,-769,-769,-769,960,-769,-769,-769 DATA 960,31998,31998,31999,961,31996,31996,31999,963,31992,31992,31999 DATA 966,31984,31984,31999,960,31999,31999,31999,960,31999,31999,31999 DATA 960,31999,31999,31999,960,15614,15614,15614,960,3320,3320,3320,960 DATA -769,-769,-769,960,192,192,192,-1,128,128,128,-1,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,16,16,-1,-1,-1,-1 DATA -257,-257,-257,-1,-769,-769,-769,960,-769,-769,-769,960,15612,15612 DATA 15612,960,-25351,-25351,-25351,960,-13069,-13069,-13069,960,-13069 DATA -13069,-13069,960,-25345,-25345,-25345,960,15615,15615,15615,960,31998 DATA 31998,31998,960,-769,-769,-769,960,31998,31998,31998,960,-769,-769 DATA -769,960,192,192,192,-1,128,128,128,-1,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,16,16,-257,-257,-257,256,-257 DATA -257,-257,256,-257,-257,-257,256,-258,-258,-258,256,-2338,-2338,-2338 DATA 256,12008,12008,12008,256,7923,7923,7923,259,3810,3810,3810,258,640 DATA 640,640,256,3808,3808,3808,256,7920,7920,7920,256,12008,12008,12008 DATA 256,-2338,-2338,-2338,256,-258,-258,-258,256,-257,-257,-257,256, DATA ,,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,16,16,,,-257,-1,,,-257,-1,,,-257,-1,,,-258,-2,,,-2338 DATA -2082,,,12008,12264,3,3,7923,8179,2,2,3810,4066,,,640,896,, DATA 3808,4064,,,7920,8176,,,12008,12264,,,-2338,-2082,,,-258,-2 DATA ,,-257,-1,,,,-1,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,16,16,-257,-257,-257,256,-1889,-1889,-257,1888 DATA -3953,-3953,-257,3376,-7482,-7482,-258,6424,-14654,-14654,-290,12556 DATA 3808,3808,32494,24838,7920,7920,-265,-16125,3808,3808,-12573,-32511 DATA 640,640,-15741,-16126,3808,3808,-4377,24838,3824,3824,32510,12556 DATA 1760,1760,16124,6424,-7482,-7482,-258,3376,-3954,-3954,-258,1888,-1889 DATA -1889,-257,256,,,,-1 DATA 9,5,155,155,155,,-32662,-32662,-32662,,-32663,-32663,-32663,,-32662 DATA -32662,-32662,,155,155,155,,,,,,,, DATA 16,16,-1,-1,-1,,-1,-1,-1,,-1,-1,-1,,-1,32766,32766,,-1,32764,32764 DATA ,-1,32760,32760,,-1,32752,32752,,-1,32766,32766,,-1,32766,32766 DATA ,-1,32766,32766,,-1,32766,32766,,-1,32766,32766,,-1,16380,16380 DATA ,-1,4080,4080,,-1,-1,-1,,-1,-1,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,16,16,-1,-1,-1,,-1,-1,-1, DATA -1,-1,-1,,8184,-1,8184,,4080,16380,4080,,-14365,-8197,-14365, DATA -6173,-5,-6173,,-14361,-2073,-14361,0,4095,-4097,4095,,8188,8191 DATA 8188,,-8,-4,-8,,-2061,-5,-2061,,992,-1025,992,,992,992,992,,-1 DATA -1,-1,,-1,-1,-1,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,16,16,-1,-1,-1,,-1,-1,-1,,-1,-1,-1,,8176,8176 DATA -1,,4064,4064,12280,,-12313,-12313,-4121,,-12289,-12289,-4097, DATA -12289,-12289,-4097,,8188,8188,-8193,,-12289,-12289,-4097,,-12289 DATA -12289,-4097,,-12313,-12313,-4097,,4064,4064,-4113,,8176,8176,8176 DATA ,-1,-1,-1,,-1,-1,-1,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,16,16,-1,-1,-1,,-1,-1,-1,,-1,-1,-1,,-4097 DATA -28673,-28673,,-4097,4095,4095,,-20481,4094,4094,,28671,20476,20476 DATA ,-4098,-12296,-12296,,-4099,-12303,-12303,,-4101,-12317,-12317 DATA ,-4105,-12345,-12345,,-2049,1920,1920,,14208,1920,1920,,-12289 DATA -12289,-12289,,-1,-1,-1,,-1,-1,-1,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,16,16,-1,-1,-1,,-1,-1,-1, DATA -1,-1,-1,,-2049,2016,-2049,-4065,6128,2016,6128,4112,-6153,-6169 DATA -6153,16,-9,-25,-9,16,-1,8160,-1,-8161,16368,4080,16368,12288,-2049 DATA -14337,-2049,12288,-2049,-6145,-2049,4096,-2049,-14361,-2049,12312 DATA -4113,4064,-4113,-8177,8176,8176,8176,,-1,-1,-1,,-1,-1,-1,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,16,16 DATA -1,-1,-1,,-1,-1,-1,,-1,-1,-1,,8176,-8193,8176,-16369,4064,12280 DATA 4064,8216,-12345,-12297,-12345,48,-49,-17,-49,32,8136,-17,8136,-8153 DATA 4032,12264,4032,8232,-14393,-10249,-14393,4144,-6193,-2065,-6193,4128 DATA -14393,-2057,-14393,12336,4064,-4113,4064,-8177,8176,8176,8176,,-1 DATA -1,-1,,-1,-1,-1,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,16,16,-1,-1,-1,,-1,-1,-1,,-1,-1,-1,,1984,-2049 DATA -2049,-4033,1984,14320,14320,12336,-12337,-4145,-4145,8192,-28673 DATA -4097,-4097,24576,-24577,-8193,-8193,16384,8191,-8193,-8193,-16384 DATA 16383,-16385,-16385,-32768,16382,-16385,-16385,-32767,32766,32767 DATA 32767,1,16376,-16385,-16385,-32761,16376,16376,16376,,-1,-1,-1, DATA -1,-1,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,16,16,-1,-1,-1,,-1,-1,-1,,-1,-1,-1,,8184,8184,-1,-8185 DATA 4080,4080,-1,4104,-14365,-14365,-1,8208,-14365,-14365,-1,8208,4080 DATA 4080,-1,-8181,2016,2016,-1,2064,-7225,-7225,-1,1056,-3121,-3121,-1 DATA 1056,-7225,-7225,-1,5160,2016,2016,-1,-6121,4080,4080,-1,4104,-1,-1 DATA -1,,-1,-1,-1 DATA 20,20,-1,-16,-3841,-1,240,,2046,-272,-4089,2046,240,,504,-1552,-3847 DATA -1543,496,248,240,-2064,-3842,-265,2032,254,224,-4240,28927,-17,3952 DATA 255,192,-8400,-20225,-33,8112,-32513,192,-9168,-20237,-3108,7344,-32525 DATA 128,-17392,-12045,-3140,15568,-16141,128,-16624,-12033,-65,16336,-16129 DATA 128,-16624,-12033,-65,16336,-16129,128,-16624,-12033,-65,16336,-16129 DATA 128,-16624,-12033,-65,16336,-16129,128,-17648,-12035,-581,15312,-16131 DATA 192,-9424,-20227,-549,7088,-32515,192,-8912,-20229,-1059,7600,-32517 DATA 224,-4496,28679,2030,3696,7,240,-2064,-3842,-265,2032,254,504,-1552 DATA -3847,-1543,496,248,2046,-272,-4089,2046,240,,-1,-16,-3841,-1,240 DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,20,20,-1,-16,-3841,-1,240,,2046 DATA -272,-4089,2046,240,,504,-1552,-3847,-1543,496,248,240,-2064,-3842 DATA -265,2032,254,224,-4240,28927,-17,3952,255,192,-9168,-20381,25564 DATA 7344,-32669,192,-9168,-20381,25564,7344,-32669,128,-17392,-12189,25532 DATA 15568,-16285,128,-16624,-12033,-65,16336,-16129,128,-16624,-12033 DATA -65,16336,-16129,128,-16624,-12033,-65,16336,-16129,128,-16624,-12033 DATA -65,16336,-16129,128,-16624,-12129,-24641,16336,-16225,192,-8400,-20465 DATA 4063,8112,-32753,192,-8400,-20465,4063,8112,-32753,224,-4240,28831 DATA -24593,3952,159,240,-2064,-3842,-265,2032,254,504,-1552,-3847,-1543 DATA 496,248,2046,-272,-4089,2046,240,,-1,-16,-3841,-1,240,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,20,20,-1,-16,-3841,-1,240,,2046,-272,-4089 DATA 2046,240,,504,-1552,-3847,-1543,496,248,240,-2064,-3842,-265,2032 DATA 254,224,-4240,28927,-17,3952,255,192,-12240,-20384,24784,4272,-32672 DATA 192,-16336,12288,192,48,0,128,-24560,20576,24736,8272,16480,128,-24560 DATA 20576,24736,8272,16480,128,-20464,-12048,-3920,12496,-16144,128,-16624 DATA -12033,-65,16336,-16129,128,-16624,-12033,-65,16336,-16129,128,-17648 DATA -12035,-581,15312,-16131,192,-9424,-20227,-549,7088,-32515,192,-8912 DATA -20229,-1059,7600,-32517,224,-4496,28679,2030,3696,7,240,-2064,-3842 DATA -265,2032,254,504,-1552,-3847,-1543,496,248,2046,-272,-4089,2046,240 DATA ,-1,-16,-3841,-1,240,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DATA ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,20,-1,-16 DATA -3841,-1,240,,2046,-272,-4089,2046,240,,504,-1552,-3847,-1543,496 DATA 248,240,-2064,-3842,-265,2032,254,224,-4240,28927,-17,3952,255,192 DATA -8912,-20373,27613,7600,-32661,192,-8656,-20233,-2082,7856,-32521 DATA 128,-17136,-12181,27581,15824,-16277,128,-16624,-12033,-65,16336,-16129 DATA 128,-16624,-12033,-65,16336,-16129,128,-16624,-12033,-65,16336,-16129 DATA 128,-16624,-12033,-65,16336,-16129,128,-16624,-12273,4031,16336,-16369 DATA 192,-8656,-20233,-2082,7856,-32521,192,-8912,-20229,-1059,7600,-32517 DATA 224,-4752,28923,-1043,3440,251,240,-2064,-3842,-265,2032,254,504,-1552 DATA -3847,-1543,496,248,2046,-272,-4089,2046,240,,-1,-16,-3841,-1,240 DATA -1,,1,,,-1,,1,-1,-1,1,-1,-1,1,1,1 DATA 9,5,-32517,-32517,-32517,,-32519,-32519,-32519,,-32640,-32640,-32640 DATA ,-32519,-32519,-32519,,-32517,-32517,-32517 DATA 9,5,-32529,-32529,-32529,,-32561,-32561,-32561,,-32640,-32640,-32640 DATA ,-32561,-32561,-32561,,-32529,-32529,-32529 SUB BoxDraw (x1, y1, x2, y2, status, height) IF status = 0 THEN cul1 = 8: cul2 = 15 IF status = 1 THEN cul1 = 15: cul2 = 8 FOR i = 0 TO height - 1 LINE (x1, y1 + i)-(x2 - i, y1 + i), cul1 LINE (x1 + i, y1)-(x1 + i, y2 - i), cul1 LINE (x1 + i + 1, y2 - i)-(x2, y2 - i), cul2 LINE (x2 - i, y1 + i + 1)-(x2 - i, y2), cul2 NEXT i END SUB SUB moff m.ax = 2: CALL INTERRUPTX(&H33, m, m) END SUB SUB mon m.ax = 1: CALL INTERRUPTX(&H33, m, m) END SUB