CHDIR ".\programs\samples\thebob\minigolf" '***************************************************************************** ' ' M I N I - G O L F ' ' Freeware - Copyright (C) 2004 by Bob Seguin ' ' Email: BOBSEG@sympatico.ca ' '***************************************************************************** DEFINT A-Z DECLARE FUNCTION InitMOUSE () DECLARE SUB MouseSTATUS (LB, RB, MouseX, MouseY) DECLARE SUB ShowMOUSE () DECLARE SUB HideMOUSE () DECLARE SUB LocateMOUSE (x, y) DECLARE SUB FieldMOUSE (x1, y1, x2, y2) DECLARE SUB PauseMOUSE (LB, RB, MouseX, MouseY) DECLARE SUB ClearMOUSE () DECLARE SUB MouseDRIVER (LB, RB, MX, MY) DECLARE SUB Interval (Length!) DECLARE SUB SetSCREEN () DECLARE SUB Digital () DECLARE SUB PrintSTRING (x, y, Prnt$) DECLARE SUB SetLEVEL (x, y) DECLARE SUB SetPALETTE (OnOFF) DECLARE SUB PutPUTTER (x, y, Angle) DECLARE SUB ControlBOX () DECLARE SUB PlayGAME () DECLARE SUB Traps () DECLARE SUB Train () DECLARE SUB Bridge () DECLARE SUB Roulette (BallSLOT, Advance, OutCOME) DECLARE SUB Instructions () DECLARE SUB ScoreCARD () DECLARE SUB EndGAME () DECLARE SUB ExitGAME () DECLARE SUB TopFIVE () CONST Degree! = 3.14159 / 180 OPTION BASE 1 DIM SHARED MouseDATA$ DIM SHARED LB, RB DIM SHARED MapX!, MapY!, IncX!, IncY! DIM SHARED BallX, BallY, ShiftX, ShiftY DIM SHARED Drop, CupX, CupY, Count& DIM SHARED Strokes, Level, Direction, GamePLAYED DIM SHARED CharBOX(22) DIM SHARED CheckCHAR AS STRING Level = 1 CheckCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz1234567890.,?'!&()-_" + CHR$(34) REDIM SHARED PuttBOX(32000) REDIM SHARED MapBOX(1, 1) REDIM SHARED FlagBOX(1) REDIM SHARED SBox(850) REDIM SHARED Box(1) REDIM SHARED FontBOX(0 TO 1) REDIM SHARED LilBOX(1) REDIM SHARED LilBOX2(1) REDIM SHARED TraxBOX(36) DIM SHARED ScoreBOX(9, 2) DIM SHARED SliderBOX(1325) DIM SHARED DigitBOX(400) DIM SHARED BallBOX(850) DIM SHARED PutterBOX(300) TYPE ScoreTYPE PlayerNAME AS STRING * 20 PlayDATE AS STRING * 10 PlayerSCORE AS INTEGER PlayerPAR AS INTEGER PlayerSTATUS AS INTEGER END TYPE DIM SHARED ScoreDATA(6) AS ScoreTYPE OPEN "mg.top" FOR APPEND AS #1: CLOSE #1 OPEN "mg.top" FOR INPUT AS #1 DO WHILE NOT EOF(1) Element = Element + 1 INPUT #1, ScoreDATA(Element).PlayerNAME INPUT #1, ScoreDATA(Element).PlayDATE INPUT #1, ScoreDATA(Element).PlayerSCORE INPUT #1, ScoreDATA(Element).PlayerPAR INPUT #1, ScoreDATA(Element).PlayerSTATUS LOOP CLOSE #1 'Create and load MouseDATA$ for CALL ABSOLUTE routines MouseDATA: DATA 55,89,E5,8B,5E,0C,8B,07,50,8B,5E,0A,8B,07,50,8B,5E,08,8B DATA 0F,8B,5E,06,8B,17,5B,58,1E,07,CD,33,53,8B,5E,0C,89,07,58 DATA 8B,5E,0A,89,07,8B,5E,08,89,0F,8B,5E,06,89,17,5D,CA,08,00 MouseDATA$ = SPACE$(57) RESTORE MouseDATA FOR i = 1 TO 57 READ h$ Hexxer$ = CHR$(VAL("&H" + h$)) MID$(MouseDATA$, i, 1) = Hexxer$ NEXT i Moused = InitMOUSE IF NOT Moused THEN PRINT "Sorry, cat must have got the mouse." Interval 2 SYSTEM END IF ParDATA: DATA 2, 3, 4, 4, 4, 2, 3, 3, 3 SCREEN 12 SetSCREEN DO PlayGAME LOOP SYSTEM PaletteDATA: DATA 0,0,12, 0,10,30, 4,11,1, 21,21,63 DATA 63,0,0, 42,0,42, 32,15,0, 63,16,0 DATA 0,63,21, 50,27,18, 5,13,1, 28,28,32 DATA 36,36,40, 44,44,48, 52,52,56, 63,63,63 SUB Bridge STATIC Index, StartTIME# SHARED BridgeNUM, StartBRIDGE IF StartBRIDGE = 0 THEN Index = 261 PUT (244, 231), SBox(Index), PSET PLAY "MBT255L64O6g" StartBRIDGE = 1 BridgeNUM = 1 StartTIME# = TIMER END IF IF TIMER > StartTIME# + 1.2 THEN Index = Index + 140 IF Index = 821 THEN Index = 261 PLAY "MBT255L64O6g" PUT (244, 231), SBox(Index), PSET BridgeNUM = BridgeNUM + 1 IF BridgeNUM = 5 THEN BridgeNUM = 1 StartTIME# = TIMER END IF END SUB SUB ClearMOUSE WHILE LB OR RB MouseSTATUS LB, RB, MouseX, MouseY WEND END SUB SUB ControlBOX STATIC SliderY1, SliderY2, Rotation, Force SHARED SlowTRAIN, Putted, MapXD, MapYD, LowerLEVEL SlowTRAIN = 0: Putted = 0 ''FieldMOUSE 0, 0, 639, 479 GET (BallX - 13, BallY - 13)-(BallX + 13, BallY + 13), PutterBOX() PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX(), XOR ShowMOUSE IF Force = 0 THEN Force = 15 Rotate = 1 DO a$ = INKEY$ IF a$ = CHR$(27) THEN SYSTEM MouseSTATUS LB, RB, MouseX, MouseY SELECT CASE MouseY CASE 166 TO 201 'Putt button IF MouseX > 527 AND MouseX < 603 THEN IF LB = -1 THEN PUT (BallX - 13, BallY - 13), PutterBOX(), PSET IF Level <> 6 THEN HideMOUSE LINE (531, 169)-(600, 199), 0, B LINE (531, 199)-(600, 199), 15 LINE (600, 168)-(600, 199), 15 ShowMOUSE Interval .1 HideMOUSE LINE (530, 168)-(600, 199), 13, B LINE (531, 169)-(598, 169), 3 LINE (531, 169)-(531, 197), 3 ShowMOUSE ClearMOUSE END IF Opp! = COS(Rotation * Degree!) Adj! = SIN(Rotation * Degree!) IncX! = (Opp! * Force) / 100 * -1 IncY! = (Adj! * Force) / 100 Putted = 1 ''FieldMOUSE 478, 0, 639, 479 EXIT SUB END IF END IF CASE 249 TO 323 'Sliders SELECT CASE MouseX CASE 535 TO 557 IF LB = -1 THEN ''FieldMOUSE 535, 250, 557, 323 IF Level = 6 THEN SlowTRAIN = 0 WHILE LB = -1 IF Level <> 6 THEN WAIT &H3DA, 8 GOSUB PutSLIDER1 IF Level = 7 THEN Bridge WEND SlowTRAIN = 1 ''FieldMOUSE 0, 0, 639, 479 Rotate = 0 END IF CASE 573 TO 595 IF LB = -1 THEN ''FieldMOUSE 573, 250, 595, 323 SlowTRAIN = 0 Rotate = 0 WHILE LB = -1 IF Level = 6 THEN Train IF Level = 7 THEN Bridge IF Level <> 6 THEN WAIT &H3DA, 8 GOSUB PutSLIDER2 IF Level = 6 THEN Train WEND SlowTRAIN = 1 ''FieldMOUSE 0, 0, 639, 479 END IF END SELECT CASE 368 TO 380 'Instructions IF MouseX > 531 AND MouseX < 599 THEN IF MenuNUM <> 2 THEN GOSUB CloseMENU MenuY = 368 MI = 721 GOSUB OpenMENU MenuNUM = 2 END IF IF LB = -1 THEN ERASE MapBOX REDIM PuttBOX(32000) Instructions ERASE PuttBOX IF Level = 5 AND LowerLEVEL = 1 THEN REDIM MapBOX(1 TO 188, 1 TO 140) DEF SEG = VARSEG(MapBOX(1, 1)) BLOAD "mglev5b.map", VARPTR(MapBOX(1, 1)) DEF SEG ELSE REDIM MapBOX(MapXD, MapYD) FileNAME$ = "mglevel" + LTRIM$(STR$(Level)) + ".map" DEF SEG = VARSEG(MapBOX(1, 1)) BLOAD FileNAME$, VARPTR(MapBOX(1, 1)) DEF SEG END IF END IF END IF CASE 398 TO 414 'EXIT IF MouseX > 541 AND MouseX < 588 THEN IF LB THEN HideMOUSE LINE (542, 398)-(587, 414), 11, B LINE (542, 414)-(587, 414), 15 LINE (587, 398)-(587, 414), 15 ShowMOUSE Interval .1 HideMOUSE LINE (542, 398)-(587, 414), 15, B LINE (542, 414)-(587, 414), 11 LINE (587, 398)-(587, 414), 11 ShowMOUSE Interval .1 ExitGAME END IF END IF CASE ELSE GOSUB CloseMENU END SELECT IF Rotate = 1 THEN PUT (BallX - 13, BallY - 13), PutterBOX(), PSET IF Level = 4 THEN Traps IF MapBOX(MapX!, MapY!) < 0 THEN GET (BallX - 13, BallY - 13)-(BallX + 13, BallY + 13), PutterBOX() END IF END IF Angler = Angler + 5 IF Angler = 360 THEN Angler = 0 PutPUTTER BallX, BallY, Angler WAIT &H3DA, 8 WAIT &H3DA, 8, 8 END IF IF Level = 4 AND Rotate = 0 THEN Traps IF Level = 6 THEN Train IF Level = 7 THEN Bridge IF LB = -1 AND MenuNUM THEN ClearMOUSE END IF IF Level = 7 THEN Bridge LOOP EXIT SUB OpenMENU: HideMOUSE GET (532, MenuY)-(598, MenuY + 13), SliderBOX(981) PUT (532, MenuY), SliderBOX(MI), PSET ShowMOUSE RETURN CloseMENU: IF MenuNUM THEN HideMOUSE PUT (532, MenuY), SliderBOX(981), PSET ShowMOUSE MenuNUM = 0 END IF RETURN PutSLIDER1: IF SliderBOX(131) THEN HideMOUSE PUT (535, SliderY1), SliderBOX(131), PSET ShowMOUSE ELSE HideMOUSE PUT (535, 316), SliderBOX(65), PSET ShowMOUSE END IF SliderY1 = MouseY - 5 HideMOUSE GET (535, SliderY1)-(557, SliderY1 + 9), SliderBOX(131) PUT (535, SliderY1), SliderBOX(), PSET ShowMOUSE Force = 317 - SliderY1 IF Force < 0 THEN Force = 0 IF Force > 72 THEN Force = 72 Force = Force + 15 RETURN PutSLIDER2: IF SliderBOX(1251) THEN HideMOUSE PUT (573, SliderY2), SliderBOX(1251), PSET ShowMOUSE ELSE HideMOUSE PUT (573, 316), SliderBOX(65), PSET ShowMOUSE END IF SliderY2 = MouseY - 5 HideMOUSE GET (573, SliderY2)-(595, SliderY2 + 9), SliderBOX(1251) PUT (573, SliderY2), SliderBOX(), PSET ShowMOUSE Angle = 317 - SliderY2 IF Angle < 0 THEN Angle = 0 IF Angle > 72 THEN Angle = 72 Rotation = Angle * 5 - 90 HideMOUSE PUT (BallX - 13, BallY - 13), PutterBOX(), PSET GET (BallX - 13, BallY - 13)-(BallX + 13, BallY + 13), PutterBOX() PutPUTTER BallX, BallY, Rotation ShowMOUSE WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 RETURN END SUB SUB Digital x = 558: y = 139 Num$ = LTRIM$(STR$(Strokes)) IF LEN(Num$) = 1 THEN Num$ = "0" + Num$ FOR Digit = 1 TO LEN(Num$) Digit$ = MID$(Num$, Digit, 1) DigitINDEX = VAL(Digit$) * 40 + 1 PUT (x, y), DigitBOX(DigitINDEX), PSET x = x + DigitBOX(DigitINDEX) NEXT Digit END SUB SUB EndGAME HideMOUSE BEEP OPEN "mgover.dat" FOR INPUT AS #1 FOR x = 0 TO 257 FOR y = 0 TO 60 INPUT #1, Colr IF Colr THEN PSET (x + 140, y + 230), Colr NEXT y NEXT x CLOSE #1 DO: LOOP UNTIL INKEY$ = "" Interval 1.4 REDIM PuttBOX(16000) DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgfinal1.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (110, 159), PuttBOX(), PSET ScoreCARD a$ = INPUT$(1) IF a$ = CHR$(27) THEN SYSTEM REDIM FontBOX(0 TO 5171) DEF SEG = VARSEG(FontBOX(0)) BLOAD "mg.fbs", VARPTR(FontBOX(0)) DEF SEG IF 1000 - Strokes > ScoreDATA(5).PlayerSTATUS THEN IF 1000 - Strokes > ScoreDATA(1).PlayerSTATUS THEN DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgfinal5.bsv", VARPTR(PuttBOX(1)) DEF SEG ELSE DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgfinal2.bsv", VARPTR(PuttBOX(1)) DEF SEG END IF PUT (110, 159), PuttBOX(), PSET GOSUB GetNAME IF LEN(ScoreDATA(6).PlayerNAME) THEN FOR a = 1 TO 6 FOR B = a TO 6 IF ScoreDATA(B).PlayerSTATUS > ScoreDATA(a).PlayerSTATUS THEN SWAP ScoreDATA(B), ScoreDATA(a) NEXT B NEXT a OPEN "mg.top" FOR OUTPUT AS #1 FOR n = 1 TO 5 WRITE #1, ScoreDATA(n).PlayerNAME, ScoreDATA(n).PlayDATE, ScoreDATA(n).PlayerSCORE, ScoreDATA(n).PlayerPAR, ScoreDATA(n).PlayerSTATUS NEXT n CLOSE #1 END IF END IF DO: LOOP UNTIL INKEY$ = "" TopFIVE ERASE FontBOX a$ = INPUT$(1) IF a$ = CHR$(27) THEN SYSTEM x1 = 268: x2 = 268 y1 = 100: y2 = 100 'Erase previous level graphic FOR n = 0 TO 248 IF x2 + n > 470 THEN y2 = 110 LINE (x1 - n, y1)-(x1 - n, 460), 0 LINE (x2 + n, y2)-(x2 + n, 460), 0 NEXT n DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgfinal4.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (80, 190), PuttBOX(), PSET GamePLAYED = 1 a$ = INPUT$(1) IF a$ = CHR$(13) THEN Level = 1 Count& = 0 EXIT SUB ELSEIF a$ = CHR$(27) THEN SYSTEM ELSE ExitGAME END IF EXIT SUB GetNAME: x = 170 LINE (x, 298)-(x + 5, 298), 12, B DO DO k$ = INKEY$ LOOP UNTIL k$ <> "" SELECT CASE k$ CASE CHR$(8) 'Backspace IF CharX THEN LINE (x, 298)-(x + 5, 298), 14, BF LINE (CharBOX(CharX), 286)-(x, 298), 14, BF Name$ = LEFT$(Name$, LEN(Name$) - 1) x = CharBOX(CharX) LINE (x, 298)-(x + 5, 298), 12, B CharX = CharX - 1 END IF CASE CHR$(13) 'Enter Name$ = LTRIM$(Name$) IF LEN(Name$) THEN LINE (x, 298)-(x + 5, 298), 14, BF ScoreDATA(6).PlayerNAME = Name$ ScoreDATA(6).PlayDATE = DATE$ ScoreDATA(6).PlayerSCORE = Strokes ScoreDATA(6).PlayerPAR = Strokes - 28 ScoreDATA(6).PlayerSTATUS = 1000 - Strokes ELSE ScoreDATA(6).PlayerSTATUS = 0 END IF Name$ = "" CharX = 0 ERASE CharBOX EXIT DO CASE CHR$(27) SYSTEM CASE ELSE IF INSTR(CheckCHAR, k$) THEN IF LEN(Name$) < 20 THEN Name$ = Name$ + k$ LINE (x, 298)-(x + 5, 298), 14, BF CharX = CharX + 1 CharBOX(CharX) = x PrintSTRING x, 286, k$ LINE (x, 298)-(x + 5, 298), 12, B END IF END IF END SELECT LOOP RETURN END SUB SUB ExitGAME SetPALETTE 0 HideMOUSE CLS ERASE MapBOX REDIM PuttBOX(16000) DEF SEG = VARSEG(PuttBOX(1)) IF ScoreBOX(1, 2) = 0 AND GamePLAYED = 0 THEN BLOAD "mgsplsh1.bsv", VARPTR(PuttBOX(1)) PUT (154, 140), PuttBOX(1), PSET DEF SEG SetPALETTE 1 ELSE BLOAD "mgsplsh2.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (154, 140), PuttBOX(1), PSET SetPALETTE 1 OPEN "mgthanks.dat" FOR INPUT AS #1 FOR x = 0 TO 210 FOR y = 0 TO 38 INPUT #1, Colr IF Colr THEN PSET (x + 208, y + 248), 8 NEXT y IF x MOD 5 = 0 THEN WAIT &H3DA, 8 NEXT x CLOSE #1 END IF SLEEP 1 SYSTEM END SUB SUB FieldMOUSE (x1, y1, x2, y2) MouseDRIVER 7, 0, x1, x2 MouseDRIVER 8, 0, y1, y2 END SUB SUB HideMOUSE LB = 2 MouseDRIVER LB, 0, 0, 0 END SUB FUNCTION InitMOUSE LB = 0 MouseDRIVER LB, 0, 0, 0 InitMOUSE = LB END FUNCTION SUB Instructions ClearMOUSE HideMOUSE GET (110, 159)-(439, 347), PuttBOX() DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mghelp1.bsv", VARPTR(PuttBOX(16100)) DEF SEG PUT (110, 159), PuttBOX(16100), PSET ShowMOUSE DO a$ = INKEY$ IF a$ = CHR$(27) THEN SYSTEM MouseSTATUS LB, RB, MouseX, MouseY IF MouseX > 379 AND MouseX < 421 THEN IF MouseY > 177 AND MouseY < 199 THEN IF CloseMENU = 0 THEN GOSUB OpenCLOSE ELSE GOSUB CloseCLOSE END IF ELSE GOSUB CloseCLOSE END IF IF CloseMENU AND LB = -1 THEN IF HelpCOUNT = 0 THEN ClearMOUSE HelpCOUNT = 1 DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mghelp2.bsv", VARPTR(PuttBOX(16100)) DEF SEG HideMOUSE PUT (110, 159), PuttBOX(16100), PSET ShowMOUSE CloseMENU = 0 ELSE EXIT DO END IF END IF LOOP HideMOUSE PUT (110, 159), PuttBOX(), PSET ShowMOUSE ClearMOUSE EXIT SUB OpenCLOSE: HideMOUSE FOR x = 380 TO 416 FOR y = 182 TO 194 IF POINT(x, y) = 1 THEN PSET (x, y), 8 NEXT y NEXT x ShowMOUSE CloseMENU = 1 RETURN CloseCLOSE: IF CloseMENU = 1 THEN HideMOUSE FOR x = 380 TO 416 FOR y = 182 TO 194 IF POINT(x, y) = 8 THEN PSET (x, y), 1 NEXT y NEXT x ShowMOUSE CloseMENU = 0 END IF RETURN END SUB DEFSNG A-Z SUB Interval (Length!) OldTimer# = TIMER DO a$ = INKEY$ IF a$ = CHR$(27) THEN SYSTEM LOOP UNTIL TIMER > OldTimer# + Length! WAIT &H3DA, 8 END SUB DEFINT A-Z SUB LocateMOUSE (x, y) LB = 4 MX = x MY = y MouseDRIVER LB, 0, MX, MY END SUB SUB MouseDRIVER (LB, RB, MX, MY) DEF SEG = VARSEG(MouseDATA$) Mouse = SADD(MouseDATA$) CALL ABSOLUTE(LB, RB, MX, MY, Mouse) END SUB SUB MouseSTATUS (LB, RB, MouseX, MouseY) LB = 3 MouseDRIVER LB, RB, MX, MY LB = ((RB AND 1) <> 0) RB = ((RB AND 2) <> 0) MouseX = MX MouseY = MY END SUB SUB PauseMOUSE (OldLB, OldRB, OldMX, OldMY) SHARED Key$ DO Key$ = UCASE$(INKEY$) MouseSTATUS LB, RB, MouseX, MouseY LOOP UNTIL LB <> OldLB OR RB <> OldRB OR MouseX <> OldMX OR MouseY <> OldMY OR Key$ <> "" END SUB SUB PlayGAME SHARED BoxCAR, BallIN, StopTRAIN, BridgeNUM, StartBRIDGE, LowerLEVEL SELECT CASE Level CASE 1 Strokes = 0 Digital RESTORE ParDATA FOR n = 1 TO 9 READ ScoreBOX(n, 1) ScoreBOX(n, 2) = 0 NEXT n SetLEVEL 81, 101 IF GamePLAYED THEN SHELL "MGTheme" CASE 2 SetLEVEL 70, 121 CASE 3 SetLEVEL 53, 117 CASE 4 SetLEVEL 40, 140 CASE 5 LowerLEVEL = 0 SetLEVEL 40, 112 CASE 6 BoxCAR = 0: BallIN = 0: StopTRAIN = 0: Direction = 0 SetLEVEL 60, 116 CASE 7 BridgeNUM = 0: StartBRIDGE = 0 SetLEVEL 60, 116 CASE 8 SetLEVEL 70, 110 CASE 9 SetLEVEL 109, 105 END SELECT BallX = MapX! * 2 + ShiftX BallY = MapY! * 2 + ShiftY GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX(), XOR DO ControlBOX Strokes = Strokes + 1 ScoreBOX(Level, 2) = ScoreBOX(Level, 2) + 1 Digital PUT (BallX - 5, BallY - 5), BallBOX(450), PSET PLAY "MBT220L64O3C" DO SELECT CASE MapBOX(MapX!, MapY!) CASE 0 Bounce = 0 Cup = 0 MapX! = LocX!: MapY! = LocY! CASE -1, 1, 1000 SELECT CASE Level CASE 2 IF MapBOX(MapX!, MapY!) = 1 THEN FOR Index = 261 TO 456 STEP 65 PUT (246, 231), SBox(Index), PSET WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 NEXT Index END IF PLAY "MFT255O2L64cp16 84 THEN 'bottom half IF MapX! < 61 THEN 'left side StartDEGREES = 331 Advance = 37 ELSE 'right side StartDEGREES = 31 Advance = 34 END IF ELSE 'top half IF MapX! < 61 THEN 'left side StartDEGREES = 171 Advance = 45 ELSE 'right side StartDEGREES = 111 Advance = 48 END IF END IF Roulette StartDEGREES, Advance, 4 END SELECT CASE -2, 2, 20 Bounce = 0 CupSOUND = 0 Cup = 0 LocX! = MapX!: LocY! = MapY! CASE -3, 3 'left well SELECT CASE Level CASE 4 IF Drop = 2 THEN Sy = 188: Sy2 = 205 SI = 571 GOSUB DropBALL MapX! = 117 MapY! = 34 IncX! = ABS(IncX!) IncY! = 0 END IF CASE 5 PLAY "MBMST255L64O3gP32eP32cO2CP32CP32>" GET (138, 297)-(152, 311), SBox(456) PUT (138, 297), SBox(391), AND PUT (138, 297), SBox(261), XOR Interval 0 PUT (138, 297), SBox(391), AND PUT (138, 297), SBox(326), XOR Interval 0 PUT (138, 297), SBox(456), PSET Interval .5 PLAY "MFCP32CP32CP32CP32CP32CP32C" GOSUB NewMAP MapX! = 105: MapY! = 20 BumpUP! = ABS(IncX!) + ABS(IncY!) IF BumpUP! < .2 THEN BumpUP! = .2 IncX! = .36 * BumpUP!: IncY! = .18 * BumpUP! CASE 9 IF MapY! > 84 THEN 'bottom half StartDEGREES = 311 Advance = 45 ELSE StartDEGREES = 191 Advance = 52 END IF Roulette StartDEGREES, Advance, 2 GOSUB ResetBALL END SELECT CASE 4, 40 IF Bounce <> 4 THEN SwapX! = IncX! IncX! = IncY! * -1 IncY! = SwapX! * -1 PLAY "MBMST255L64O2C" Bounce = 4 END IF CASE -5, 5 'right well SELECT CASE Level CASE 4 IF Drop = 3 THEN Sy = 218 Sy2 = 235 SI = 681 GOSUB DropBALL MapX! = 117 MapY! = 49 IncX! = ABS(IncX!) IncY! = 0 END IF CASE 5 GET (198, 237)-(212, 251), SBox(456) PUT (198, 237), SBox(391), AND PUT (198, 237), SBox(261), XOR Interval 0 PUT (198, 237), SBox(391), AND PUT (198, 237), SBox(326), XOR Interval 0 PUT (198, 237), SBox(456), PSET PLAY "MBMST255L32O4Cp32bp32 84 THEN 'bottom half IF MapX! > 59 THEN 'right side StartDEGREES = 351 Advance = 44 ELSE 'left side StartDEGREES = 291 Advance = 47 END IF ELSE IF MapX! > 59 THEN 'right side StartDEGREES = 151 Advance = 54 ELSE 'top half 'left side StartDEGREES = 211 Advance = 51 END IF END IF Roulette StartDEGREES, Advance, 3 END SELECT CASE 6, 60 IF Bounce <> 6 THEN SwapX! = IncX! IncX! = IncY! * -1 IncY! = SwapX! * -1 PLAY "MBMST255L64O2C" Bounce = 6 END IF CASE 7, 70 IF Bounce <> 7 THEN IncY! = ABS(IncY!) PLAY "MBMST255L64O2C" Bounce = 7 END IF CASE 8, 80 IF Bounce <> 8 THEN SwapX! = IncX! SWAP IncX!, IncY! SWAP IncY!, SwapX! PLAY "MBMST255L64O2C" Bounce = 8 END IF CASE 9, 90 IF Bounce <> 9 THEN IncY! = -ABS(IncY!) PLAY "MBMST255L64O2C" Bounce = 9 END IF CASE 10, 100 IF Bounce <> 10 THEN IncX! = -ABS(IncX!) PLAY "MBMST255L64O2C" Bounce = 10 END IF CASE 11, 110 IF Bounce <> 11 THEN IncX! = ABS(IncX!) PLAY "MBMST255L64O2C" Bounce = 11 END IF CASE 12 IF (ABS(IncX!) + ABS(IncY!)) < .2 THEN Cup = 1 ELSE IF CupSOUND = 0 THEN PLAY "MBMST255L64O5C" CupSOUND = 1 END IF END IF CASE 13, 130 IF Bounce <> 13 THEN SWAP IncX!, IncY! PLAY "MBMST255L64O2C" Bounce = 13 END IF CASE 14 IF MapY! > 84 THEN 'bottom half StartDEGREES = 11 Advance = 43 ELSE StartDEGREES = 131 Advance = 36 END IF Roulette StartDEGREES, Advance, 1 Cup = 1 CASE 15 'hole 9 only PUT (170, 141), SBox(261), PSET PLAY "MfT255O2L64a" WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(326), PSET WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(391), PSET PLAY "MfT255O3L64c" WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(456), PSET GOSUB ResetBALL CASE 30 SELECT CASE IncX! CASE IS < 0 SELECT CASE BridgeNUM CASE 1: IncY! = 0 CASE 2: GOSUB SinkBALL CASE 3: PLAY "MBMST255L64O2b": IncX! = IncX! * -1 CASE 4: GOSUB Splunk END SELECT CASE IS > 0 SELECT CASE BridgeNUM CASE 1: IncY! = 0 CASE 2: GOSUB Splunk CASE 3: PLAY "MBMST255L64O2b": IncX! = IncX! * -1 CASE 4: GOSUB SinkBALL END SELECT END SELECT END SELECT BallX = MapX! * 2 + ShiftX BallY = MapY! * 2 + ShiftY Count2 = Count2 + 1 IF Count2 = 32000 THEN Count2 = 0 IF Cup = 1 THEN Count2 = Count2 - Count2 MOD 3 IF Count2 MOD 3 = 0 THEN IF Cup = 1 THEN PUT (CupX, CupY), BallBOX(201), AND PUT (CupX, CupY), BallBOX(), XOR PLAY "MBMST255O5L64ap32bp32>c" Cup = 0 Level = Level + 1 IF Level = 7 THEN StopTRAIN = 0 Interval 2 IF Level = 10 THEN ERASE MapBOX EndGAME END IF EXIT SUB END IF GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) IF Level = 4 THEN Traps IF MapBOX(MapX!, MapY!) < 20 THEN PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX(), XOR IF Level = 6 THEN Train IF Level = 7 THEN Bridge END IF WAIT &H3DA, 8 IF Level <> 6 THEN WAIT &H3DA, 8, 8 PUT (BallX - 5, BallY - 5), BallBOX(450), PSET GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) IncX! = IncX! * .994 IncY! = IncY! * .994 END IF MapX! = MapX! + IncX! MapY! = MapY! + IncY! LOOP WHILE (ABS(IncX!) + ABS(IncY!)) > .05 GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) IF MapBOX(MapX!, MapY!) < 20 THEN PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX(), XOR ELSE GOSUB ResetBALL IF Level = 5 THEN ERASE MapBOX REDIM MapBOX(67, 115) DEF SEG = VARSEG(MapBOX(1, 1)) BLOAD "mglevel5.map", VARPTR(MapBOX(1, 1)) DEF SEG END IF GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX(), XOR END IF LOOP IF MapBOX(MapX!, MapY!) < 20 THEN PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX() END IF EXIT SUB DropBALL: PUT (235, Sy), SBox(), AND PUT (235, Sy), SBox(221), XOR WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (235, Sy), SBox(), AND PUT (235, Sy), SBox(331), XOR WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (235, Sy), SBox(SI), PSET PLAY "MFT220L64O2AP32FP32DP1" GET (270, Sy2)-(274, Sy2 + 11), SBox(800) PUT (270, Sy2), SBox(441), PSET WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (270, Sy2), SBox(800), PSET RETURN NewMAP: ERASE MapBOX REDIM MapBOX(1 TO 188, 1 TO 140) DEF SEG = VARSEG(MapBOX(1, 1)) BLOAD "mglev5b.map", VARPTR(MapBOX(1, 1)) DEF SEG ShiftX = 45: ShiftY = 116 MapX! = MapX! + 31: MapY! = MapY! + 26 LowerLEVEL = 1 RETURN ResetBALL: SELECT CASE Level CASE 2 ResetX = 119: ResetY = 379 MapX! = 28: MapY! = 133 ShiftX = 70: ShiftY = 121 CASE 5: ResetX = 168: ResetY = 381 MapX! = 34: MapY! = 109.5 ShiftX = 107: ShiftY = 169 LowerLEVEL = 0 CASE 7: ResetX = 104: ResetY = 378 MapX! = 25: MapY! = 83.5 CASE 8: ResetX = 193: ResetY = 371 MapX! = 27.5: MapY! = 132.5 CASE 9: ResetX = 252: ResetY = 382 MapX! = 58.5: MapY! = 141.5 END SELECT IncX! = 0: IncY! = 0 PUT (ResetX, ResetY), SBox(), PSET PLAY "MBT255L64O6b" PLAY "MFMST255L64O3gP32eP32cO1CP32CP32" PLAY "CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32C" PLAY "CP32CP32CP32CP32CP32CP32CP32CP32CP32" PLAY "CP32CP32CP32CP32CP32CP32CP32CP32CP32CP32O5BP32>BP32>c" FOR Index = 851 TO 2251 STEP 200 WAIT &H3DA, 8 PUT (242, 195), SBox(Index), PSET Interval .02 NEXT Index GOSUB ResetBALL RETURN END SUB SUB PrintSTRING (x, y, Prnt$) FOR i = 1 TO LEN(Prnt$) Char$ = MID$(Prnt$, i, 1) IF Char$ = " " THEN x = x + FontBOX(1) ELSE Index = (ASC(Char$) - 33) * FontBOX(0) + 2 PUT (x, y), FontBOX(Index) x = x + FontBOX(Index) END IF NEXT i END SUB SUB PutPUTTER (x, y, Angle) Angle2 = Angle - 60 Angle3 = Angle + 60 Adj = COS(Angle * Degree!) * 3 Opp = SIN(Angle * Degree!) * 3 Adj1 = COS(Angle * Degree!) * 4 Opp1 = SIN(Angle * Degree!) * 4 Adj4 = COS(Angle * Degree!) * 5 Opp4 = SIN(Angle * Degree!) * 5 Adj2 = COS(Angle2 * Degree!) * 9 Opp2 = SIN(Angle2 * Degree!) * 9 Adj3 = COS(Angle3 * Degree!) * 9 Opp3 = SIN(Angle3 * Degree!) * 9 PointX = x + Adj PointY = y - Opp LeftX = PointX + Adj2 LeftY = PointY - Opp2 RightX = PointX + Adj3 RightY = PointY - Opp3 PointX2 = x + Adj1 PointY2 = y - Opp1 LeftX2 = PointX2 + Adj2 LeftY2 = PointY2 - Opp2 RightX2 = PointX2 + Adj3 RightY2 = PointY2 - Opp3 PointX3 = x + Adj4 PointY3 = y - Opp4 LeftX3 = PointX3 + Adj2 LeftY3 = PointY3 - Opp2 RightX3 = PointX3 + Adj3 RightY3 = PointY3 - Opp3 SELECT CASE Angle CASE 90, -90, 270 LINE (LeftX, RightY)-(RightX, RightY), 12 LINE (LeftX2, RightY2)-(RightX2, RightY2), 13 LINE (LeftX3, RightY3)-(RightX3, RightY3), 15 LINE (LeftX, LeftY)-(LeftX, LeftY3), 15 LINE (RightX, RightY)-(RightX, RightY3), 15 CASE 180 LINE (LeftX, LeftY)-(LeftX, RightY), 12 LINE (LeftX2, LeftY2)-(LeftX2, RightY2), 13 LINE (LeftX3, LeftY3)-(LeftX3, RightY3), 15 LINE (LeftX, LeftY)-(LeftX, LeftY3), 15 LINE (RightX, RightY)-(LeftX3, RightY3), 15 CASE ELSE LINE (LeftX, LeftY)-(RightX, RightY), 12 LINE (LeftX2, LeftY2)-(RightX2, RightY2), 13 LINE (LeftX3, LeftY3)-(RightX3, RightY3), 15 LINE (LeftX, LeftY)-(LeftX3, LeftY3), 15 LINE (RightX, RightY)-(RightX3, RightY3), 15 END SELECT END SUB SUB Roulette (BallSLOT, Advance, OutCOME) nn = BallSLOT FOR Spins = 1 TO Advance a$ = INKEY$ IF a$ = CHR$(27) THEN SYSTEM nn = nn + 20 IF nn = 360 + BallSLOT THEN nn = BallSLOT Adj! = 260 + 54 * SIN(Degree! * nn) Opp! = 280 + 54 * COS(Degree! * nn) PUT (198, 217), SBox(525), PSET SpinCOUNT = SpinCOUNT + 1 IF SpinCOUNT MOD 2 THEN PUT (198, 217), SBox(525), PSET ELSE PUT (198, 217), SBox(4530), PSET END IF GET (Adj! - 5, Opp! - 5)-(Adj! + 5, Opp! + 5), BallBOX(450) PUT (Adj! - 5, Opp! - 5), BallBOX(201), AND PUT (Adj! - 5, Opp! - 5), BallBOX() IF Spins > Advance * .6 THEN Clicks = 3 ELSE Clicks = 1 FOR Reps = 1 TO Clicks WAIT &H3DA, 8 WAIT &H3DA, 8, 8 NEXT Reps PLAY "MFT255O6L64a" PUT (Adj! - 5, Opp! - 5), BallBOX(450), PSET NEXT Spins SELECT CASE OutCOME CASE 1 GOSUB Cuppa CASE 2 GOSUB Sewer CASE 3 MapX! = 74 MapY! = 55 IncX! = -.15 IncY! = -(RND * .5) - .01 CASE 4: MapX! = 55 MapY! = 122 IncX! = .05 IncY! = (RND * .2) + .01 END SELECT EXIT SUB Sewer: x! = 267: y! = 210 DO GET (x!, y!)-(x! + 10, y! + 10), BallBOX(450) PUT (x!, y!), BallBOX(201), AND PUT (x!, y!), BallBOX() WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (x!, y!), BallBOX(450), PSET x! = x! - 1: y! = y! - 1.5 LOOP WHILE y! > 109 PLAY "MBMST255L64O2C" DO GET (x!, y!)-(x! + 10, y! + 10), BallBOX(450) PUT (x!, y!), BallBOX(201), AND PUT (x!, y!), BallBOX() WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (x!, y!), BallBOX(450), PSET x! = x! - 1: y! = y! + 1.4 LOOP WHILE y! < 142 PUT (170, 141), SBox(261), PSET PLAY "MfT255O2L64a" WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(326), PSET WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(391), PSET PLAY "MfT255O3L64c" WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (170, 141), SBox(456), PSET RETURN Cuppa: x! = 282: y! = 216 DO GET (x!, y!)-(x! + 10, y! + 10), BallBOX(450) PUT (x!, y!), BallBOX(201), AND PUT (x!, y!), BallBOX() WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (x!, y!), BallBOX(450), PSET x! = x! - .52: y! = y! - 1.3 LOOP WHILE y! > 109 PLAY "MBMST255L64O2C" DO GET (x!, y!)-(x! + 10, y! + 10), BallBOX(450) PUT (x!, y!), BallBOX(201), AND PUT (x!, y!), BallBOX() WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (x!, y!), BallBOX(450), PSET x! = x! - .52: y! = y! + 1.3 LOOP WHILE y! < 197 PLAY "MBMST255L64O2C" SlowY! = .52 SlowX! = 1.3 DO GET (x!, y!)-(x! + 10, y! + 10), BallBOX(450) PUT (x!, y!), BallBOX(201), AND PUT (x!, y!), BallBOX() WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (x!, y!), BallBOX(450), PSET SlowX! = SlowX! * .993 SlowY! = SlowY! * .993 x! = x! + SlowX!: y! = y! - SlowY! LOOP WHILE x! < 334 RETURN END SUB SUB ScoreCARD REDIM NumBOX(1900) DEF SEG = VARSEG(NumBOX(1)) BLOAD "mgnums.fbs", VARPTR(NumBOX(1)) DEF SEG FOR y = 204 TO 268 STEP 32 FOR x = 190 TO 370 STEP 90 ParCOUNT = ParCOUNT + 1 NumVAL = ScoreBOX(ParCOUNT, 2) - ScoreBOX(ParCOUNT, 1) SELECT CASE NumVAL CASE IS < 0 PUT (x, y), NumBOX(1321) x = x + NumBOX(1321) GOSUB PrintNUMS x = x - NumBOX(1321) CASE 0 PUT (x, y), NumBOX(1441) CASE IS > 0 PUT (x, y), NumBOX(1201) x = x + NumBOX(1201) GOSUB PrintNUMS x = x - NumBOX(1201) END SELECT NEXT x NEXT y x = 290: y = 300 NumVAL = Strokes GOSUB PrintNUMS FinalSCORE = Strokes - 28 PUT (331, 297), NumBOX(1641) IF FinalSCORE < 0 THEN PUT (338, 305), NumBOX(1321) IF FinalSCORE > 0 THEN PUT (338, 305), NumBOX(1201) IF FinalSCORE = 0 THEN PUT (338, 302), NumBOX(1441) PUT (366, 300), NumBOX(1741) ERASE NumBOX EXIT SUB END IF x = 348: y = 300 NumVAL = FinalSCORE GOSUB PrintNUMS PUT (xx, 297), NumBOX(1741) ERASE NumBOX EXIT SUB PrintNUMS: Num$ = LTRIM$(STR$(ABS(NumVAL))) xx = x FOR n = 1 TO LEN(Num$) Char$ = MID$(Num$, n, 1) Index = VAL(Char$) * 120 + 1 PUT (xx, y), NumBOX(Index) xx = xx + NumBOX(Index) NEXT n RETURN END SUB SUB SetLEVEL (x, y) STATIC NewGAME SHARED MapXD, MapYD x1 = 268: x2 = 268 y1 = 100: y2 = 100 'Erase previous level graphic HideMOUSE FOR n = 0 TO 248 IF x2 + n > 470 THEN y2 = 110 LINE (x1 - n, y1)-(x1 - n, 460), 0 LINE (x2 + n, y2)-(x2 + n, 460), 0 NEXT n ERASE MapBOX REDIM PuttBOX(32000) FileNAME$ = "mglevel" + LTRIM$(STR$(Level)) + ".bsv" DEF SEG = VARSEG(PuttBOX(1)) BLOAD FileNAME$, VARPTR(PuttBOX(1)) DEF SEG PUT (x, y), PuttBOX(), PSET ShowMOUSE ERASE PuttBOX 'PUT level number on flag REDIM FlagBOX(1 TO 5000) DEF SEG = VARSEG(FlagBOX(1)) BLOAD "mgfnums.bsv", VARPTR(FlagBOX(1)) DEF SEG HideMOUSE PUT (538, 44), FlagBOX(555 * (Level - 1) + 1), PSET ShowMOUSE ERASE FlagBOX IF NewGAME = 0 THEN SetPALETTE 1 NewGAME = 1 END IF SELECT CASE Level CASE 1 MapX! = 134: MapY! = 133 ShiftX = 91: ShiftY = 111 CupX = 134: CupY = 154 REDIM MapBOX(157, 157) MapXD = 157: MapYD = 157 CASE 2 MapX! = 27.5: MapY! = 132.5 ShiftX = 70: ShiftY = 121 CupX = 379: CupY = 141 DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec2.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(182, 146) MapXD = 182: MapYD = 146 CASE 3 MapX! = 148: MapY! = 118 ShiftX = 60: ShiftY = 137 CupX = 142: CupY = 150 REDIM MapBOX(192, 127) MapXD = 192: MapYD = 127 CASE 4 MapX! = 50: MapY! = 105 ShiftX = 42: ShiftY = 141 CupX = 371: CupY = 360 REDIM SBox(1330) DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec4.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(217, 136) MapXD = 217: MapYD = 136 CASE 5 MapX! = 34: MapY! = 109.5 ShiftX = 107: ShiftY = 169 CupX = 399: CupY = 154 DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec5.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(67, 115) MapXD = 67: MapYD = 115 CASE 6 'MapX! = 59.5: MapY! = 24 MapX! = 59.5: MapY! = 23.5 ShiftX = 286: ShiftY = 238 CupX = 84: CupY = 280 DEF SEG = VARSEG(TraxBOX(1)) BLOAD "mgtrack.lin", VARPTR(TraxBOX(1)) DEF SEG REDIM LilBOX(410) REDIM LilBOX2(410) REDIM MapBOX(69, 47) MapXD = 69: MapYD = 47 CASE 7 MapX! = 25: MapY! = 83.5 ShiftX = 61: ShiftY = 218 CupX = 249: CupY = 409 REDIM SBox(1 TO 2650) DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec7.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(192, 90) MapXD = 192: MapYD = 90 CASE 8 MapX! = 27.5: MapY! = 132.5 ShiftX = 145: ShiftY = 113 CupX = 345: CupY = 162 DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec5.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(118, 144) MapXD = 118: MapYD = 144 CASE 9 MapX! = 58.5: MapY! = 141.5 ShiftX = 142: ShiftY = 106 CupX = 338: CupY = 143 REDIM SBox(1 TO 8600) DEF SEG = VARSEG(SBox(1)) BLOAD "mgspec9.bsv", VARPTR(SBox(1)) DEF SEG REDIM MapBOX(117, 151) MapXD = 117: MapYD = 151 END SELECT FileNAME$ = "mglevel" + LTRIM$(STR$(Level)) + ".map" DEF SEG = VARSEG(MapBOX(1, 1)) BLOAD FileNAME$, VARPTR(MapBOX(1, 1)) DEF SEG END SUB SUB SetPALETTE (OnOFF) SELECT CASE OnOFF CASE 0 OUT &H3C8, 0 FOR n = 1 TO 48 OUT &H3C9, 0 NEXT n CASE 1 RESTORE PaletteDATA OUT &H3C8, 0 FOR n = 1 TO 48 READ Intensity Intensity = Intensity + 10 IF Intensity > 63 THEN Intensity = 63 OUT &H3C9, Intensity NEXT n OUT &H3C8, 0 OUT &H3C9, 0 OUT &H3C9, 0 OUT &H3C9, 18 'RESTORE PaletteDATA 'OUT &H3C8, 0 'FOR n = 1 TO 48 'READ Intensity: OUT &H3C9, Intensity 'NEXT n END SELECT END SUB SUB SetSCREEN SetPALETTE 0 DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgsplsh1.bsv", VARPTR(PuttBOX(16100)) DEF SEG PUT (154, 140), PuttBOX(16100), PSET SetPALETTE 1 SHELL "MGTheme.EXE" Interval .75 SetPALETTE 0 CLS 'Screen borders LINE (5, 5)-(634, 474), 2, B LINE (10, 10)-(629, 469), 2, B 'Load title DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgtitle.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (20, 20), PuttBOX(), PSET 'Load golfball image and mask DEF SEG = VARSEG(BallBOX(1)) BLOAD "mgball.bsv", VARPTR(BallBOX(1)) DEF SEG 'Load control panel DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgctrl2.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (438, 27), PuttBOX(), PSET 'Load digital numbers DEF SEG = VARSEG(DigitBOX(1)) BLOAD "mgdigits.bsv", VARPTR(DigitBOX(1)) DEF SEG Digital 'Load control slider images DEF SEG = VARSEG(SliderBOX(1)) BLOAD "mgctrl.bsv", VARPTR(SliderBOX(1)) DEF SEG PUT (535, 316), SliderBOX(), PSET PUT (573, 316), SliderBOX(), PSET 'LocateMOUSE 563, 350 ERASE PuttBOX END SUB SUB ShowMOUSE LB = 1 MouseDRIVER LB, 0, 0, 0 END SUB SUB TopFIVE DEF SEG = VARSEG(PuttBOX(1)) BLOAD "mgfinal3.bsv", VARPTR(PuttBOX(1)) DEF SEG PUT (110, 159), PuttBOX(), PSET TopY = 223 FOR n = 1 TO 5 IF ScoreDATA(n).PlayerSCORE <> 0 THEN PrintSTRING 136, TopY, RTRIM$(ScoreDATA(n).PlayerNAME) PrintSTRING 276, TopY, ScoreDATA(n).PlayDATE PrintSTRING 354, TopY, LTRIM$(STR$(ScoreDATA(n).PlayerSCORE)) IF ScoreDATA(n).PlayerPAR = 0 THEN PrintSTRING 392, TopY, "Par" ELSE PrintSTRING 393, TopY, LTRIM$(STR$(ScoreDATA(n).PlayerPAR)) END IF END IF TopY = TopY + 19 NEXT n END SUB SUB Train STATIC y, yy, Route, TrackINDEX, Count STATIC StartINDEX, StopINDEX, TrainX, TrackY, UpDOWN SHARED SlowTRAIN, Putted, BoxCAR, BallIN, StopTRAIN SELECT CASE Direction CASE 0 'Load Train" DEF SEG = VARSEG(LilBOX(1)) BLOAD "mgtrupe.lin", VARPTR(LilBOX(1)) DEF SEG DEF SEG = VARSEG(LilBOX2(1)) BLOAD "mgtrupf.lin", VARPTR(LilBOX2(1)) DEF SEG StartINDEX = 1: StopINDEX = 1 TrackINDEX = 13: TrackY = 433 TrainX = 265: UpDOWN = 1 y = 365: Route = -1 Direction = 1 CASE 1 IF StopTRAIN = 0 THEN IF y > 184 THEN yy = y ELSE yy = 184 IF Count AND StartINDEX < 403 THEN StartINDEX = StartINDEX + 6 IF yy = 184 THEN Count = 1 IF SlowTRAIN AND Putted = 0 THEN WAIT &H3DA, 8 GOSUB PutTRAIN IF y > 298 AND StopINDEX < 403 THEN StopINDEX = StopINDEX + 6 IF y MOD 12 = 0 THEN SOUND 12000, .05 TrackINDEX = TrackINDEX - 6 IF TrackINDEX = -5 THEN TrackINDEX = 31 IF y < 298 THEN PUT (TrainX, TrackY), TraxBOX(TrackINDEX), PSET IF y < 126 THEN LINE (TrainX, TrackY)-(TrainX + 14, TrackY), 0 TrackY = TrackY - 1 y = y - 1 IF y > 227 AND y < 246 THEN BoxCAR = 1 ELSE BoxCAR = 0 END IF IF y = 115 THEN LINE (265, 184)-(279, 185), 0, B Count = 0 Direction = 2 END IF END IF CASE 2 'Load Train" DEF SEG = VARSEG(LilBOX(1)) BLOAD "mgtrdne.lin", VARPTR(LilBOX(1)) DEF SEG DEF SEG = VARSEG(LilBOX2(1)) BLOAD "mgtrdnf.lin", VARPTR(LilBOX2(1)) DEF SEG StartINDEX = 1: StopINDEX = 1 TrackINDEX = 13: TrackY = 116 TrainX = 198: UpDOWN = -1 y = 184 Route = 1 Direction = 3 CASE 3 IF y < 365 THEN yy = y ELSE yy = 365 IF Count AND StartINDEX < 403 THEN StartINDEX = StartINDEX + 6 IF yy = 365 THEN Count = 1 IF SlowTRAIN AND Putted = 0 THEN WAIT &H3DA, 8 GOSUB PutTRAIN IF y > 183 AND StopINDEX < 403 THEN StopINDEX = StopINDEX + 6 IF y MOD 12 = 0 THEN SOUND 12000, .05 IF y <= 261 AND y > 250 THEN LINE (TrainX, TrackY)-(TrainX + 14, TrackY), 0, B IF y > 261 THEN PUT (TrainX, TrackY), TraxBOX(TrackINDEX), PSET TrackINDEX = TrackINDEX + 6 IF TrackINDEX = 37 THEN TrackINDEX = 1 TrackY = TrackY + 1 y = y + 1 IF y = 433 THEN PUT (TrainX, TrackY), TraxBOX(TrackINDEX), PSET Count = 0 Direction = 0 END IF IF BallIN AND y > 335 THEN BallIN = 0 END SELECT EXIT SUB PutTRAIN: Index = StartINDEX FOR Reps = 1 TO 68 SELECT CASE UpDOWN CASE 1 SELECT CASE BallIN CASE 0: PUT (TrainX, yy), LilBOX(Index), PSET CASE 1: PUT (TrainX, yy), LilBOX2(Index), PSET END SELECT CASE -1 SELECT CASE BallIN CASE 0: PUT (TrainX, yy), LilBOX(Index), PSET CASE 1: PUT (TrainX, yy), LilBOX2(Index), PSET END SELECT END SELECT IF Index < StopINDEX THEN Index = Index + 6 yy = yy + UpDOWN END IF NEXT Reps RETURN END SUB SUB Traps STATIC StartTIME#, Trap SHARED StartTRAPS IF StartTRAPS = 0 THEN PUT (235, 218), SBox(681), PSET PLAY "MBT220L64O0CO6B" Trap = 1 StartTIME# = TIMER StartTRAPS = 1 END IF IF TIMER - StartTIME# > 1 THEN GOSUB Trap EXIT SUB DropBALL2: SELECT CASE Drop CASE 1 Sy = 158: Sy2 = 175 SI = 461 MapX! = 117 MapY! = 19 GET (235, 158)-(252, 175), SBox(851) CASE 2 Sy = 188: Sy2 = 205 SI = 571 MapX! = 117 MapY! = 34 GET (235, 188)-(252, 205), SBox(851) CASE 3 Sy = 218 Sy2 = 235 SI = 681 MapX! = 117 MapY! = 49 GET (235, 218)-(252, 235), SBox(851) END SELECT PUT (235, Sy), SBox(), AND PUT (235, Sy), SBox(221), XOR WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (235, Sy), SBox(), AND PUT (235, Sy), SBox(331), XOR WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (235, Sy), SBox(SI), PSET PLAY "MBT220L64O2AP32FP32D" Interval 1 GET (270, Sy2)-(274, Sy2 + 11), SBox(800) PUT (270, Sy2), SBox(441), PSET WAIT &H3DA, 8 WAIT &H3DA, 8, 8 WAIT &H3DA, 8 WAIT &H3DA, 8, 8 PUT (270, Sy2), SBox(800), PSET IncX! = .25 IncY! = 0 BallX = MapX! * 2 + 42 BallY = MapY! * 2 + 141 GET (313, BallY - 13)-(339, BallY + 13), PutterBOX() GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) DO IF TIMER > StartTIME# + 1 THEN GOSUB Trap PUT (BallX - 5, BallY - 5), BallBOX(450), PSET MapX! = MapX! + IncX! BallX = MapX! * 2 + 42 BallY = MapY! * 2 + 141 GET (BallX - 5, BallY - 5)-(BallX + 5, BallY + 5), BallBOX(450) PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX() WAIT &H3DA, 8 IncX! = IncX! * .994 LOOP WHILE IncX! > .1 PUT (BallX - 13, BallY - 13), PutterBOX(), PSET PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX() GET (BallX - 13, BallY - 13)-(BallX + 13, BallY + 13), PutterBOX() IncX! = 0 RETURN Trap: Count& = Count& + 1 SELECT CASE Count& MOD 3 CASE 0 PUT (235, 188), SBox(1111), PSET PUT (235, 218), SBox(461), PSET Drop = 3 IF MapBOX(MapX!, MapY!) = -5 THEN GOSUB DropBALL2 CASE 1 PUT (235, 218), SBox(1221), PSET PUT (235, 158), SBox(571), PSET Drop = 1 IF MapBOX(MapX!, MapY!) = -1 THEN GOSUB DropBALL2 CASE 2 PUT (235, 158), SBox(1001), PSET PUT (235, 188), SBox(681), PSET Drop = 2 IF MapBOX(MapX!, MapY!) = -3 THEN GOSUB DropBALL2 END SELECT PLAY "MBT220L64O0CO6B" StartTIME# = TIMER PUT (BallX - 5, BallY - 5), BallBOX(201), AND PUT (BallX - 5, BallY - 5), BallBOX() RETURN END SUB