CHDIR ".\programs\samples\thebob\pongg"

'****************************************************************************
'---------------------------- P O N G G ! - 2.0 -----------------------------
'---------------------- Freeware by Bob Seguin - 2007 -----------------------
'****************************************************************************

DEFINT A-Z

DECLARE SUB MouseDRIVER (LB, RB, MX, MY)
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 FUNCTION InitMOUSE ()

DECLARE SUB PrintSTRING (x, y, Prnt$, Mode)
DECLARE SUB Alphagetti (x, y, Char$, Mode)
DECLARE SUB Interval (Length!)
DECLARE SUB DrawSCREEN ()
DECLARE SUB SetPALETTE ()
DECLARE SUB PrintSCORE (x, n$)
DECLARE SUB TopFIVE ()
DECLARE SUB EndGAME ()

'$DYNAMIC

DIM SHARED BallBOX(1 TO 400)
DIM SHARED BackBOX(1 TO 200)
DIM SHARED HeadBOX(1 TO 1600)
DIM SHARED PaddleBOX(1 TO 250)
DIM SHARED BigBOX(1 TO 26000)
DIM SHARED FontBOX(7100)
DIM SHARED CharBOX(1 TO 22)

TYPE PlayerTYPE
PlayerNAME AS STRING * 20
PlayerSCORE AS LONG
PlayDATE AS STRING * 10
END TYPE
DIM SHARED PlayerBOX(1 TO 6) AS PlayerTYPE
OPEN "pongg.top" FOR APPEND AS #1
CLOSE #1

OPEN "pongg.top" FOR INPUT AS #1
DO WHILE NOT EOF(1)
    in = in + 1
    INPUT #1, PlayerBOX(in).PlayerNAME
    INPUT #1, PlayerBOX(in).PlayerSCORE
    INPUT #1, PlayerBOX(in).PlayDATE
LOOP
CLOSE #1

DIM SHARED MouseDATA$
'Create and load MouseDATA$ for CALL ABSOLUTE routines
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)
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
    COLOR 12
    LOCATE 10, 24: PRINT "Sorry, cat must have got the mouse."
    LOCATE 11, 24: PRINT STRING$(37, "-")
    LOCATE 12, 24: PRINT "Since this is a mouse-driven program,"
    LOCATE 13, 24: PRINT "it will have to be shut down."
    SLEEP 3
    SYSTEM
END IF
LocateMOUSE 308, 440

SCREEN 12
SetPALETTE
DrawSCREEN

PaddleX = 281
BallX = 310: BallY = 62
Lives = 5
PrintSCORE 106, "5"
PrintSCORE 582, "000000"
Start = 1
GET (310, 62)-(330, 92), BackBOX()
PUT (310, 62), BallBOX(201), AND
PUT (310, 62), BallBOX(), OR
RANDOMIZE TIMER
Start = 1: BincX = 0: BincY = 0

DO
    Beginning:
    MouseSTATUS LB, RB, MouseX, MouseY
    Key$ = UCASE$(INKEY$)
    SELECT CASE Key$
        CASE "T"
            TopFIVE
        CASE " "
            RePAUSE:
            DO: k$ = UCASE$(INKEY$): LOOP UNTIL k$ <> ""
            IF k$ = CHR$(27) THEN CLS: SYSTEM
            IF k$ = "T" THEN
                TopFIVE
                PUT (BallX, BallY), BallBOX(), PSET
                GOTO RePAUSE
            END IF
        CASE CHR$(27)
            CLS
            SYSTEM
    END SELECT
    IF Start = 1 THEN
        IF Lives = 5 THEN PLAY "MBT120L64O4cP32dP32eP32fP32gP32fP32eP32dP32c"
        LINE (PaddleX, 440)-(PaddleX + 79, 450), 0, BF
        LocateMOUSE 308, 440
        PaddleX = 281
        PUT (PaddleX, 440), PaddleBOX(), PSET
        DO
            MouseSTATUS LB, RB, MouseX, MouseY
            k$ = UCASE$(INKEY$)
            LINE (255 - Scan, 20)-(267 - Scan, 36), 5, BF
            LINE (375 + Scan, 20)-(387 + Scan, 36), 5, BF
            Scan = Scan + 12: IF Scan = 120 THEN Scan = 0
            LINE (255 - Scan, 20)-(267 - Scan, 36), 12, BF
            LINE (375 + Scan, 20)-(387 + Scan, 36), 12, BF
            WAIT &H3DA, 8: WAIT &H3DA, 8, 8
        LOOP UNTIL LB OR (k$ = "X" OR k$ = "T" OR k$ = "R" OR k$ = CHR$(27))
        LINE (255 - Scan, 20)-(267 - Scan, 36), 5, BF
        LINE (375 + Scan, 20)-(387 + Scan, 36), 5, BF
        SELECT CASE k$
            CASE "R"
                PaddleX = 281
                BallX = 310: BallY = 62
                LINE (BallX, BallY)-(BallX + 20, BallY + 22), 0, BF
                GET (BallX, BallY)-(BallX + 20, BallY + 20), BackBOX()
                PUT (BallX, BallY), BallBOX(201), AND
                PUT (BallX, BallY), BallBOX(), OR
                Lives = 5
                PlayerBOX(6).PlayerSCORE = 0
                Start = 1
                PrintSCORE 106, "5"
                PrintSCORE 582, "000000"
                GOTO Beginning
            CASE "X"
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggin1.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (198, 178), BigBOX(), PSET
                DO
                    k$ = INKEY$
                LOOP UNTIL k$ <> ""
                IF k$ = CHR$(27) THEN CLS: SYSTEM
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggin2.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (198, 178), BigBOX(), PSET
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggacc.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (110, 118), BigBOX(4001), PSET
                PUT (409, 118), BigBOX(6001), PSET
                DO
                    k$ = INKEY$
                LOOP UNTIL k$ <> ""
                IF k$ = CHR$(27) THEN CLS: SYSTEM
                PUT (110, 118), BigBOX(1), PSET
                PUT (409, 118), BigBOX(2001), PSET
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggin3.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (198, 178), BigBOX(), PSET
                DO
                    k$ = INKEY$
                LOOP UNTIL k$ <> ""
                IF k$ = CHR$(27) THEN CLS: SYSTEM
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggbak.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (198, 178), BigBOX(), PSET
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggops.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (246, 230), BigBOX(), PSET
                GOTO Beginning
            CASE CHR$(27)
                CLS
                SYSTEM
            CASE "T"
                TopFIVE
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggops.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (246, 230), BigBOX(), PSET
                GOTO Beginning
        END SELECT
        MouseX = 308
        DEF SEG = VARSEG(BigBOX(1))
        BLOAD "ponggbak.bsv", VARPTR(BigBOX(1))
        DEF SEG
        PUT (198, 178), BigBOX(), PSET
        BincX = FIX(RND * 7) - 3: BincY = INT(RND * 3) + 4
        LocateMOUSE 308, 440
        Start = 0
    END IF
    SELECT CASE BincX
        CASE IS < 0
            IF BallX <= 12 THEN BincX = ABS(BincX): GOSUB NEON
        CASE IS > 0
            IF BallX >= 607 THEN BincX = -BincX: GOSUB NEON
    END SELECT
    SELECT CASE BincY
        CASE IS < 0
            IF BallY <= 60 THEN
                GOSUB NEON
                BincY = FIX(RND * 4) + 6
                BincX = FIX(RND * 11) - 5
            END IF
        CASE IS > 0
            IF BallY >= 419 THEN
                IF BallX + 10 >= PaddleX AND BallX + 10 <= PaddleX + 79 THEN
                    IF ABS(BincX) = ABS(OldBINCx) THEN BincX = BincX + FIX(RND * 5) - 2
                    BincY = -BincY: PLAY "MBMST220L64O1B"
                    OldBINCx = BincX

                    PlayerBOX(6).PlayerSCORE = PlayerBOX(6).PlayerSCORE + 10
                    IF Score = 1 THEN PlayerBOX(6).PlayerSCORE = PlayerBOX(6).PlayerSCORE + 15
                    IF Score = 2 THEN PlayerBOX(6).PlayerSCORE = PlayerBOX(6).PlayerSCORE + 40

                    PS$ = LTRIM$(STR$(PlayerBOX(6).PlayerSCORE))
                    SELECT CASE LEN(PS$)
                        CASE 1: PS$ = "00000" + PS$
                        CASE 2: PS$ = "0000" + PS$
                        CASE 3: PS$ = "000" + PS$
                        CASE 4: PS$ = "00" + PS$
                        CASE 5: PS$ = "0" + PS$
                    END SELECT
                    PrintSCORE 582, PS$
                    Score = 0
                END IF
            END IF
            IF BallY >= 430 THEN
                SOUND 50, 5
                LINE (BallX - 1, BallY - 1)-(BallX + 21, BallY + 21), 0, B
                PAINT (BallX + 10, BallY + 10), 15, 0
                Interval 0
                PAINT (BallX + 10, BallY + 10), 4, 0
                Interval 0
                PAINT (BallX + 10, BallY + 10), 14, 0
                Interval 0
                LINE (BallX, BallY)-(BallX + 20, BallY + 20), 0, BF
                GET (310, 60)-(330, 80), BackBOX()
                LINE (14, 440)-(625, 450), 0, BF
                PaddleX = 281: Paddle = 0
                LocateMOUSE 308, 440
                PUT (PaddleX, 440), PaddleBOX(), PSET
                BallX = 310: BallY = 60: Start = 1
                BincX = 0: BincY = 0

                Lives = Lives - 1
                Lives$ = LTRIM$(STR$(Lives))
                PrintSCORE 106, Lives$
                IF Lives = 0 THEN EndGAME

                Score = 0
                DEF SEG = VARSEG(BigBOX(1))
                BLOAD "ponggops.bsv", VARPTR(BigBOX(1))
                DEF SEG
                PUT (246, 230), BigBOX(), PSET
            END IF
    END SELECT

    WAIT &H3DA, 8
    WAIT &H3DA, 8, 8

    OUT &H3C8, 2
    OUT &H3C9, 50
    OUT &H3C9, 10
    OUT &H3C9, 50
    OUT &H3C8, 3
    OUT &H3C9, 50
    OUT &H3C9, 10
    OUT &H3C9, 50

    PUT (BallX, BallY), BackBOX(), PSET

    IF BincY = 0 THEN BincY = 2
    IF BincX > 10 OR BincX < -10 THEN BincY = BincY + 1

    IF BincX > 8 THEN BincX = BincX - 1
    IF BincY > 8 THEN BincY = BincY - 1
    IF BincX < -8 THEN BincX = BincX + 1
    IF BincY < -8 THEN BincY = BincY + 1

    BallX = BallX + BincX: BallY = BallY + BincY 'Update X/Y's
    IF BallX < 13 THEN BallX = 14: GOSUB NEON: BincX = ABS(BincX) + 1
    IF BallX > 608 THEN BallX = 607: GOSUB NEON: BincX = -ABS(BincX) - 1
    IF BallY < 60 THEN BallY = 60
    IF BallY > 439 AND BincY < 0 THEN BallY = 438

    IF BallY < 400 THEN
        GET (BallX, BallY)-(BallX + 20, BallY + 20), BackBOX()
    ELSE
        GET (310, 60)-(330, 80), BackBOX()
    END IF
    PUT (BallX, BallY), BallBOX(201), AND
    PUT (BallX, BallY), BallBOX(), OR

    IF BallY < 167 THEN
        IF BallX < 130 THEN 'LEFT Accelerator
            BallCX = BallX + 10: BallCY = BallY + 10
            IF BallCX > 67 THEN 'right half
                DiffX = BallCX - 67
                Q1 = 1
            ELSE
                DiffX = 67 - BallCX 'left half
                Q1 = 2
            END IF
            IF BallCY > 126 THEN 'lower half
                DiffY = BallCY - 126
                Q2 = 4
            ELSE 'upper half
                DiffY = 126 - BallCY
                Q2 = 8
            END IF
            IF SQR(DiffX ^ 2 + DiffY ^ 2) <= 37 THEN
                Quadrant = Q1 + Q2
                SELECT CASE Quadrant
                    CASE 5 'lower right
                        BincX = ABS(BincX) + 4
                        BincY = -ABS(BincY) + 1
                    CASE 6 'lower left
                        BincX = -ABS(BincX) - 1
                        BincY = ABS(BincY) + INT(RND * 2)
                    CASE 9 'upper right
                        BincX = ABS(BincX) + 3
                        BincY = ABS(BincY)
                    CASE 10 'upper left
                        BincX = ABS(BincX) + 3
                        BincY = ABS(BincY)
                END SELECT
                Score = 1
                GOSUB Accelerator1
            END IF
        END IF
        IF BallX > 495 THEN 'RIGHT Accelerator
            BallCX = BallX + 10: BallCY = BallY + 10
            IF BallCX > 565 THEN 'right half
                DiffX = BallCX - 565
                Q1 = 1
            ELSE
                DiffX = 565 - BallCX 'left half
                Q1 = 2
            END IF
            IF BallCY > 126 THEN 'bottom half
                DiffY = BallCY - 126
                Q2 = 4
            ELSE 'top half
                DiffY = 126 - BallCY
                Q2 = 8
            END IF
            IF SQR(DiffX ^ 2 + DiffY ^ 2) <= 37 THEN
                Quadrant = Q1 + Q2
                OldDIFF = Diff
                SELECT CASE Quadrant
                    CASE 5 'lower right
                        BincX = -ABS(BincX) - 4
                        BincY = -ABS(BincY) + 1
                    CASE 6 'lower left
                        BincX = -ABS(BincX) - 5
                        BincY = ABS(BincY) + INT(RND * 1)
                    CASE 9 'upper right
                        BincX = ABS(BincX) + 4
                        BincY = ABS(BincY)
                    CASE 10 'upper left
                        BincX = ABS(BincX) + 2
                        BincY = ABS(BincY)
                END SELECT
                GOSUB Accelerator2
                Score = 2
            END IF
        END IF
    END IF

    LINE (PaddleX, 440)-(PaddleX + 79, 450), 0, BF

    PaddleX = MouseX - 27
    PaddleX = PaddleX + Paddle
    IF PaddleX < 14 THEN PaddleX = 14
    IF PaddleX > 546 THEN PaddleX = 546
    PUT (PaddleX, 440), PaddleBOX(), PSET

LOOP

END

'------------------------------- SUBROUTINES ---------------------------------

NEON:
PLAY "MBMST220L64O1B"
OUT &H3C8, 13
OUT &H3C9, 0
OUT &H3C9, 63
OUT &H3C9, 0
WAIT &H3DA, 8
WAIT &H3DA, 8, 8
OUT &H3C8, 13
OUT &H3C9, 42
OUT &H3C9, 42
OUT &H3C9, 42
RETURN

Accelerator1:
OUT &H3C8, 3
OUT &H3C9, 63
OUT &H3C9, 50
OUT &H3C9, 63
WAIT &H3DA, 8
GOSUB AcceleratorSOUND
RETURN

Accelerator2:
OUT &H3C8, 2
OUT &H3C9, 63
OUT &H3C9, 50
OUT &H3C9, 63
WAIT &H3DA, 8
GOSUB AcceleratorSOUND
RETURN

AcceleratorSOUND:
Hz = 620
FOR Reps = 1 TO 3
    Hz = Hz + 100
    SOUND Hz, Hz / 3000
NEXT Reps
RETURN

PaletteDATA:
DATA 12, 2, 22, 50, 37, 63, 40, 10, 50, 40, 10, 50
DATA 53, 0, 0, 19, 2, 22, 17, 2, 22, 42, 42, 42
DATA 55, 55, 55, 16, 9, 26, 15, 2, 22, 63, 55, 55
DATA 25, 12, 35, 42, 42, 42, 55, 63, 9, 63, 63, 63

REM $STATIC
SUB ClearMOUSE
SHARED LB

WHILE LB
    MouseSTATUS LB, RB, MouseX, MouseY
WEND

END SUB

SUB DrawSCREEN

DEF SEG = VARSEG(BigBOX(1))
FOR y = 0 TO 320 STEP 160
    FileNUM = FileNUM + 1
    FileNAME$ = "pongg" + LTRIM$(STR$(FileNUM)) + ".bsv"
    BLOAD FileNAME$, VARPTR(BigBOX(1))
    PUT (0, y), BigBOX()
NEXT y
DEF SEG

DEF SEG = VARSEG(HeadBOX(1))
BLOAD "ponggnms.bsv", VARPTR(HeadBOX(1))
DEF SEG = VARSEG(PaddleBOX(1))
BLOAD "ponggpdl.bsv", VARPTR(PaddleBOX(1))
DEF SEG = VARSEG(BigBOX(1))
PUT (281, 440), PaddleBOX(), PSET
DEF SEG = VARSEG(BallBOX(1))
BLOAD "ponggbal.bsv", VARPTR(BallBOX(1))

DEF SEG = VARSEG(BigBOX(1))
BLOAD "ponggops.bsv", VARPTR(BigBOX(1))
DEF SEG

PUT (246, 230), BigBOX(), PSET
DEF SEG = VARSEG(FontBOX(0))
BLOAD "pongg2.fbs", VARPTR(FontBOX(0))
DEF SEG

END SUB

SUB EndGAME
SHARED Lives, LB
STATIC MenuY

SelectSCREEN:
IF PlayerBOX(6).PlayerSCORE > PlayerBOX(5).PlayerSCORE THEN
    GetSCORE = 1
    DEF SEG = VARSEG(BigBOX(1))
    BLOAD "pongggo1.bsv", VARPTR(BigBOX(1)) 'GO1 = Game Over 1 (3 options)
    DEF SEG
    PUT (233, 220), BigBOX(), PSET
ELSE
    DEF SEG = VARSEG(BigBOX(1))
    BLOAD "pongggo2.bsv", VARPTR(BigBOX(1)) 'GO2 = Game Over 2 (2 options)
    DEF SEG
    PUT (233, 220), BigBOX(), PSET
END IF
MenuY = 256
GET (262, 256)-(374, 273), BigBOX(7001)
LocateMOUSE 320, 310
ShowMOUSE
DO
    MouseSTATUS LB, RB, MouseX, MouseY
    SELECT CASE MouseX
        CASE 266 TO 378
            SELECT CASE MouseY
                CASE 256 TO 273
                    IF Menu <> 1 THEN
                        HideMOUSE
                        PUT (262, MenuY), BigBOX(7001), PSET
                        GET (262, 256)-(374, 273), BigBOX(7001)
                        MenuY = 256
                        PLAY "MBMST220L64O6B"
                        PUT (262, 256), BigBOX(4001), PSET
                        ShowMOUSE
                        Menu = 1
                    END IF
                    IF LB THEN
                        IF GetSCORE THEN
                            GOSUB Topper
                            GOTO SelectSCREEN
                        ELSE
                            EXIT DO
                        END IF
                    END IF
                CASE 274 TO 291
                    IF Menu <> 2 THEN
                        HideMOUSE
                        PUT (262, MenuY), BigBOX(7001), PSET
                        GET (262, 274)-(374, 291), BigBOX(7001)
                        MenuY = 274
                        PLAY "MBMST220L64O6B"
                        PUT (262, 274), BigBOX(5001), PSET
                        ShowMOUSE
                        Menu = 2
                    END IF
                    IF LB THEN
                        IF GetSCORE THEN
                            EXIT DO
                        ELSE
                            HideMOUSE
                            CLS
                            SYSTEM
                        END IF
                    END IF
                CASE 292 TO 309
                    IF Menu <> 3 AND GetSCORE THEN
                        HideMOUSE
                        PUT (262, MenuY), BigBOX(7001), PSET
                        GET (262, 292)-(374, 309), BigBOX(7001)
                        MenuY = 292
                        PLAY "MBMST220L64O6B"
                        PUT (262, 292), BigBOX(6001), PSET
                        ShowMOUSE
                        Menu = 3
                    END IF
                    IF LB AND GetSCORE THEN
                        HideMOUSE
                        CLS
                        SYSTEM
                    END IF
            END SELECT
    END SELECT
    PauseMOUSE LB, RB, MouseX, MouseY
LOOP
Lives = 5
PlayerBOX(6).PlayerSCORE = 0
PrintSCORE 106, "5"
PrintSCORE 582, "000000"
HideMOUSE
DEF SEG = VARSEG(BigBOX(1))
BLOAD "ponggbak.bsv", VARPTR(BigBOX(1))
DEF SEG
PUT (198, 178), BigBOX(), PSET
DO
    MouseSTATUS LB, RB, MouseX, MouseY
LOOP UNTIL LB
ClearMOUSE

EXIT SUB

'--------------------------------SUBROUTINES----------------------------------

Topper:

DEF SEG = VARSEG(BigBOX(1))
BLOAD "ponggbak.bsv", VARPTR(BigBOX(1))
DEF SEG
HideMOUSE
PUT (198, 178), BigBOX(), PSET

LINE (208, 198)-(428, 267), 8, BF
LINE (210, 200)-(426, 265), 15, B
LINE (218, 225)-(418, 257), 7, BF

PrintSTRING 264, 206, "Please enter your name:", 0
LINE (250, 253)-(254, 254), 15, B
x = 250

DO
    DO
        k$ = INKEY$
    LOOP UNTIL k$ <> ""
    SELECT CASE k$
        CASE CHR$(8) 'Backspace
            IF CharCOUNT THEN
                LINE (x, 253)-(x + 4, 254), 7, B
                LINE (CharBOX(CharCOUNT), 235)-(x, 255), 7, BF
                Name$ = LEFT$(Name$, LEN(Name$) - 1)
                x = CharBOX(CharCOUNT)
                LINE (x, 253)-(x + 4, 254), 15, B
                CharCOUNT = CharCOUNT - 1
            END IF
        CASE CHR$(13) 'Enter
            LINE (x, 253)-(x + 4, 254), 7, B
            PlayerBOX(6).PlayerNAME = Name$
            PlayerBOX(6).PlayDATE = DATE$
            EXIT DO
        CASE CHR$(27) 'Escape key
            CLS
            SYSTEM
        CASE ELSE
            IF LEN(Name$) < 20 THEN
                IF k$ = CHR$(34) THEN k$ = "'"
                Name$ = Name$ + k$
                LINE (x, 253)-(x + 4, 254), 7, B
                CharCOUNT = CharCOUNT + 1
                CharBOX(CharCOUNT) = x
                PrintSTRING x, 235, k$, 0
                LINE (x, 253)-(x + 4, 254), 15, B
            END IF
    END SELECT
LOOP
FOR a = 1 TO 6
    FOR B = a TO 6
        IF PlayerBOX(B).PlayerSCORE > PlayerBOX(a).PlayerSCORE THEN SWAP PlayerBOX(B), PlayerBOX(a)
    NEXT B
NEXT a
OPEN "pongg.top" FOR OUTPUT AS #1
FOR n = 1 TO 5
    WRITE #1, PlayerBOX(n).PlayerNAME, PlayerBOX(n).PlayerSCORE, PlayerBOX(n).PlayDATE
NEXT n
CLOSE #1
TopFIVE
Menu = 0: GetSCORE = 0
RETURN

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

DEFSNG A-Z
SUB Interval (Length!)

OldTimer# = TIMER
DO: 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_MOUSE_EMU (LB, RB, MX, MY) 

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 PrintSCORE (x, n$)

FOR n = 1 TO LEN(n$)
    Digit$ = MID$(n$, n, 1)
    NumSTART = VAL(Digit$) * 100 + 1
    PUT (x, 21), HeadBOX(NumSTART), PSET
    x = x + 7
NEXT n

END SUB

SUB PrintSTRING (x, y, Prnt$, Mode)

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
    IF Mode AND x > 300 THEN EXIT SUB
NEXT i

END SUB

SUB SetPALETTE

RESTORE PaletteDATA
OUT &H3C8, 0
FOR n = 1 TO 48
    READ Intensity
    OUT &H3C9, Intensity
NEXT n

END SUB

SUB ShowMOUSE
LB = 1
MouseDRIVER LB, 0, 0, 0
END SUB

SUB TopFIVE

DEF SEG = VARSEG(BigBOX(1))
BLOAD "ponggtfv.bsv", VARPTR(BigBOX(1))
DEF SEG
PUT (198, 178), BigBOX(), PSET
TopY = 210
FOR n = 1 TO 5
    IF PlayerBOX(n).PlayerSCORE <> 0 THEN
        PrintSTRING 215, TopY, RTRIM$(PlayerBOX(n).PlayerNAME), 1
        PrintSTRING 320, TopY, LTRIM$(STR$(PlayerBOX(n).PlayerSCORE)), 0
        PrintSTRING 370, TopY, PlayerBOX(n).PlayDATE, 0
    END IF
    TopY = TopY + 21
NEXT n
DO
    k$ = INKEY$
LOOP UNTIL k$ <> ""
IF k$ = CHR$(27) THEN CLS: SYSTEM
DEF SEG = VARSEG(BigBOX(1))
BLOAD "ponggbak.bsv", VARPTR(BigBOX(1))
DEF SEG
PUT (198, 178), BigBOX(), PSET

END SUB
 
SUB ABSOLUTE_MOUSE_EMU (AX%, BX%, CX%, DX%)
SELECT CASE AX%
 CASE 0
 AX% = -1
 CASE 1
 _MOUSESHOW 
 CASE 2
 _MOUSEHIDE
 CASE 3
 WHILE _MOUSEINPUT
 WEND
 BX% = -_MOUSEBUTTON(1) - _MOUSEBUTTON(2) * 2 - _MOUSEBUTTON(3) * 4
 CX% = _MOUSEX
 DX% = _MOUSEY
 CASE 4
 _MOUSEMOVE CX%, DX% 'Not currently supported in QB64 GL
END SELECT
END SUB
