'/title Solar System (view from above)
'/type for fun

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Solar System (view from above)
'---------------------------------------------------------------------
' Controls (during animation screen)
'        ESC = back to main menu
'   Spacebar = pause movement
'_____________________________________________________________________

RANDOMIZE TIMER

'+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
DIM SHARED ASCIIclrRd(15), ASCIIclrGr(15), ASCIIclrBl(15)
ff = FREEFILE: OPEN "ASCII_RGB.ini" FOR INPUT AS #ff
FOR clr = 0 TO 15
    INPUT #ff, clr, ASCIIclrRd(clr), ASCIIclrGr(clr), ASCIIclrBl(clr)
NEXT
CLOSE ff
'+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


DIM SHARED ScrnWidth: ScrnWidth = 650 '640
DIM SHARED ScrnHeight: ScrnHeight = 650 ' 480
DIM SHARED ASCIIlines, ASCIIcols

DIM SHARED YesNo$(1): YesNo$(0) = "no": YesNo$(1) = "Yes"
DIM SHARED CenterX ': CenterX = 640 / 2
DIM SHARED CenterY ': CenterY = 480 / 2
DIM SHARED OneSecCount, ScalePlanetIcon, StopAtDays, StopAtOrbits
DIM SHARED ParmsFile$: ParmsFile$ = "SolarSystem.ini"
DIM SHARED PgmTitle$: PgmTitle$ = "Solar System (above)"
DIM SHARED ShowPlanetAngleLines, field$(10), largestOrbit
DIM SHARED UseInitalAngles, RandomAngleForNoAngle, earth#, EarthDaysElapsed
_TITLE PgmTitle$

DIM SHARED DaysPerDegree, HoursPerDay
DaysIn1earthYear = 365.2422
DaysPerDegree = DaysIn1earthYear / 360
HoursPerDay = 23 + (56 / 60)
''PRINT DaysPerDegree;HoursPerDay: END

'=========================================================================
OneSecCount = 5300000 '<- temp
'=========================================================================
DIM SHARED MaxObjects: MaxObjects = 320
DIM SHARED PlanetName$(MaxObjects), PlanetPeri(MaxObjects), PlanetAphel(MaxObjects), PlanetOrbitRate(MaxObjects)
DIM SHARED PlanetOrbitDly1(MaxObjects), PlanetOrbitDly2(MaxObjects), PlanetDiam(MaxObjects)
DIM SHARED PlanetOrbitDist(MaxObjects), PlanetAngle(MaxObjects)
DIM SHARED StartAngle(MaxObjects), OrbitCount(MaxObjects), InitialAngle(MaxObjects)
DIM SHARED ObjectOrbitRatio(MaxObjects)

DIM SHARED Planets#, LargestDiam, GreatestOrbitDist
DIM SHARED OrbitDistOpt$ 'S=scaled / E=equal
DIM SHARED PlanetIconSize
DIM SHARED InnerPlanetDlyOpt$: InnerPlanetDlyOpt$ = "E"

top: '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MainMenu

ASCIIlines = ScrnHeight / 16
RemoveDecimal ASCIIlines
ASCIIlines = ASCIIlines - 2
ASCIIcols = ScrnWidth / 8
RemoveDecimal ASCIIcols

CenterX = ScrnWidth / 2
CenterY = ScrnHeight / 2

SCREEN _NEWIMAGE(ScrnWidth, ScrnHeight, 32)

'Earth
GetLabelValue ParmsFile$, "DelayPct-Earth", v$: n = VAL(v$)
GetPer OneSecCount, n, PlanetOrbitDly1(earth#)
'============================================================================

CLS

clr = 0
FOR I = Planets# TO 1 STEP -1
    PlanetAngle(I) = 0 'the Angle , set to Zero (0)
    OrbitCount(I) = 0 'orbit count
    'using initial angles?
    IF UseInitalAngles = 1 THEN
        PlanetAngle(I) = InitialAngle(I)
    END IF
    IF PlanetAngle(I) = 0 AND RandomAngleForNoAngle = 1 THEN
        PickRandomNumber 360, A
        PlanetAngle(I) = A
    END IF
    'save the starting angle (so can keep track of complete orbits)
    StartAngle(I) = PlanetAngle(I)
    PlanetOrbitDly2(I) = 0
    DrawThePlanets I, 0 'draw the planet
    ''ln = ln - 10
    IF I <= 28 THEN
        LOCATE I, 1:
        clr = clr + 1
        IF clr = 16 THEN clr = 1
        asciiCOLOR clr, -1
        PRINT PlanetName$(I)
    END IF
NEXT

''END

DrawSun

'-----------------------------------------------------------------------
x$ = ""
IF StopAtDays > 0 THEN x$ = "Stop at day:" + STR$(StopAtDays)
IF StopAtOrbits > 0 THEN x$ = "Stop at Orbits:" + STR$(StopAtOrbits)
IF x$ <> "" THEN
    p = ASCIIcols - LEN(x$)
    asciiCOLOR 5, -1: LOCATE 2, p: PRINT x$
END IF
'-----------------------------------------------------------------------

dly = 0

PausePgm ""

DO

    k$ = UCASE$(INKEY$)

    IF k$ = CHR$(27) THEN GOTO top

    IF k$ = " " THEN 'pause
        PausePgm "paused..."
    END IF

    FOR I = Planets# TO 1 STEP -1
        PlanetOrbitDly2(I) = PlanetOrbitDly2(I) + 1
    NEXT
    CheckIfMovePlanet

LOOP

SUB AdjustInnerPlanets '####################################################

    degs1 = OrbitCount(earth#) * 360 'complete orbits
    IF PlanetAngle(earth#) >= StartAngle(earth#) THEN
        degs2 = PlanetAngle(earth#) - StartAngle(earth#) 'partial orbit
    ELSE
        degs2 = (360 - StartAngle(earth#)) + PlanetAngle(earth#)
    END IF
    EarthDaysElapsed = (degs1 + degs2) * DaysPerDegree
    ''x$ = "Earth days:" + STR$(EarthDaysElapsed)
    LOCATE 1, 60: COLOR 10: PRINT USING "Earth days #,###"; EarthDaysElapsed
    'LOCATE 26: COLOR 10:
    'PRINT USING "Earth: orbits ###  days ### StartAngle ### angle ###"; OrbitCount(3); EarthDaysElapsed; StartAngle(3); PlanetAngle(3)
    ''PRINT USING "#,### #,### Days elapsed: #,###.##"; degs1; degs2; EarthDaysElapsed
    'EXIT SUB
    'END

    'If NOT using Earth's angle to adjust inner planets, exit sub
    ''IF InnerPlanetDlyOpt$ <> "E" THEN EXIT SUB

    ' june 9 : adjust ALL planets based on movement of Earth!

    FOR pl = 1 TO Planets#

        IF pl = earth# THEN pl = pl + 1 'skip Earth

        DrawThePlanets pl, 1 'erase planet

        ratio = ObjectOrbitRatio(pl)

        '360 degrees being 1 complete Earth orbit
        TotalDegreesEarthHasMoved = degs1 + degs2
        '"a" = total degress to move the planet
        '* potentially greater than 360, so reduce
        a = TotalDegreesEarthHasMoved * ratio

        O = 0
        IF a > 360 THEN
            O = a / 360 'how many complete orbits?
            RemoveDecimal O
            'remove complete orbit degrees (360) to get actual current angle
            a = a - (O * 360)
        END IF

        PlanetAngle(pl) = StartAngle(pl) + a

        DrawThePlanets pl, 0 'draw planet

        OrbitCount(pl) = O

    NEXT

    IF EarthDaysElapsed >= StopAtDays AND StopAtDays > 0 THEN
        StopAtDays = 0
        PausePgm "Pgm stopped."
    END IF

END SUB

SUB asciiCOLOR (fc, bc) '###############################################
    rd = ASCIIclrRd(fc)
    gr = ASCIIclrGr(fc)
    bl = ASCIIclrBl(fc)
    Fclr& = _RGB32(rd, gr, bl)
    IF bc < 0 THEN
        COLOR Fclr&
        EXIT SUB
    END IF
    rd = ASCIIclrRd(bc)
    gr = ASCIIclrGr(bc)
    bl = ASCIIclrBl(bc)
    Bclr& = _RGB32(rd, gr, bl)
    COLOR Fclr&, Bclr&
END SUB


SUB CheckIfMovePlanet '#####################################################

    i = earth# 'Earth

    IF PlanetOrbitDly2(i) >= PlanetOrbitDly1(i) THEN

        PlanetOrbitDly2(i) = 0 'reset delay counter
        DrawThePlanets i, 1 'erase the planet
        PlanetAngle(i) = PlanetAngle(i) + 1 'adjust angle by 1
        IF i = earth# THEN EarthMoved = 1
        IF PlanetAngle(i) > 359 THEN
            PlanetAngle(i) = 0
        END IF
        IF PlanetAngle(i) = StartAngle(i) THEN
            'planet back to starting angle, orbit complete
            'count the complete orbits
            OrbitCount(i) = OrbitCount(i) + 1
        END IF
        DrawThePlanets i, 0 're-draw it

    END IF


    IF EarthMoved THEN
        AdjustInnerPlanets
    END IF

    ShowPlanetStats
    DrawSun

    IF OrbitCount(earth#) = StopAtOrbits AND StopAtOrbits > 0 THEN
        StopAtOrbits = 0
        PausePgm "Pgm paused."
    END IF

END SUB

SUB DrawCircle (x, y, r, Rd, Gr, Bl, fill) '###########################################
    clr& = _RGB32(Rd, Gr, Bl)
    IF fill THEN
        CIRCLE (x, y), r, clr&
        PAINT (x, y), clr&, clr&
    ELSE
        CIRCLE (x, y), r, clr&
    END IF
END SUB

SUB DrawLine (x, y, angle, clr, ln) '#########################################

    rd = ASCIIclrRd(clr)
    gr = ASCIIclrGr(clr)
    bl = ASCIIclrBl(clr)
    clr& = _RGB32(rd, gr, bl)

    z$ = "bm" + LTRIM$(STR$(x)) + "," + LTRIM$(STR$(y)) + " "
    z$ = z$ + "c" + LTRIM$(STR$(clr&)) + " "
    z$ = z$ + "TA" + LTRIM$(STR$(angle)) + " "
    z$ = z$ + "u" + LTRIM$(STR$(ln))

    DRAW z$

END SUB

SUB DrawOctogon (clr, sz) '##########################################################

    rd = ASCIIclrRd(clr)
    gr = ASCIIclrGr(clr)
    bl = ASCIIclrBl(clr)
    clr& = _RGB32(rd, gr, bl)

    x$ = x$ + " r" + LTRIM$(STR$(sz))
    x$ = x$ + " e" + LTRIM$(STR$(sz))
    x$ = x$ + " u" + LTRIM$(STR$(sz))
    x$ = x$ + " h" + LTRIM$(STR$(sz))
    x$ = x$ + " l" + LTRIM$(STR$(sz))
    x$ = x$ + " g" + LTRIM$(STR$(sz))
    x$ = x$ + " d" + LTRIM$(STR$(sz))
    x$ = x$ + " f" + LTRIM$(STR$(sz))
    'x$ = x$ + " u" + LTRIM$(STR$(sz))
    'x$ = x$ + " h" + LTRIM$(STR$(sz))
    'x$ = x$ + " l" + LTRIM$(STR$(sz))
    'x$ = x$ + " g" + LTRIM$(STR$(sz))
    DRAW " c" + LTRIM$(STR$(clr&)) + x$
    'DRAW x$

END SUB

SUB DrawSun '#############################################################

    'CIRCLE (CenterX, CenterY), 2, 14
    'PAINT (CenterX, CenterY), 14, 14

    Rd = 255
    Gr = 255
    Bl = 0
    DrawCircle CenterX, CenterY, 2, Rd, Gr, Bl, 1

END SUB

SUB DrawThePlanets (i, erase) '######################################################

    x = CenterX
    y = CenterY

    angle = PlanetAngle(i)
    clr = i

    IF erase THEN 'IF erase planet?...
        clr = 0
    END IF

    IF OrbitDistOpt$ = "S" THEN
        '** scaled distance
        avg = (PlanetPeri(i) + PlanetAphel(i)) / 2
        pct = avg / largestOrbit
        sz = ScrnWidth
        IF ScrnHeight < sz THEN sz = ScrnHeight
        ln = (sz / 2) * pct
    ELSE
        '** equal distance
        ln1 = (ScrnHeight / 2) / Planets# 'equal orbit distances
        ln = ln1 * i
    END IF

    RemoveDecimal ln

    ''CIRCLE (CenterX, CenterY), ln, 8 'orbit outline
    Rd = 100
    Gr = Rd
    Bl = Rd
    DrawCircle CenterX, CenterY, ln, Rd, Gr, Bl, 0

    ''ln = 200  '<- for testing

    clr0 = 0
    IF ShowPlanetAngleLines THEN clr0 = clr
    DrawLine x, y, angle, clr0, ln

    n = PlanetIconSize

    IF ScalePlanetIcon THEN
        pct = PlanetDiam(i) / LargestDiam
        n = PlanetIconSize * pct
    END IF

    DrawOctogon clr, n


END SUB

SUB EditWithNotepad (f$) '################################################
    x$ = "file open for editing! ... " + f$
    x$ = LEFT$(x$, 80)
    x$ = x$ + SPACE$(80 - LEN(x$))
    asciiCOLOR 4, 7
    LOCATE 23, 1
    PRINT x$
    SHELL "notepad.exe " + f$
    asciiCOLOR 7, 0
    LOCATE 23, 1: PRINT SPACE$(80)
END SUB

SUB FixLTZeroExp (n) '########################################################
    '* Fix LessThan Zero Exponent
    '*   8.430523 -> .08430523
    x$ = LTRIM$(STR$(n))
    p = INSTR(x$, "E-")
    IF p = 0 THEN EXIT SUB
    e = VAL(RIGHT$(x$, 2))
    x$ = LEFT$(x$, p - 1) 'trim off E-??
    p = INSTR(x$, ".")
    'put back together without the decimal point
    ''PRINT "X(before):"; x$
    x$ = LEFT$(x$, p - 1) + RIGHT$(x$, LEN(x$) - p)
    ''x$ = LEFT$(x$, LEN(x$) - 1) 'trim off the end
    ''x$ = LEFT$(x$, 6)
    ''PRINT "X(after):"; x$
    ZerosToAdd = e - p + 1
    x$ = STRING$(ZerosToAdd, "0") + x$
    x$ = "." + LEFT$(x$, 7)
    ''PRINT "X(after,2):"; x$
    n = VAL(x$)
    'PRINT x$; "<x after"
    'END
END SUB

SUB GetFields (x$, sep$, max) '############################################
    z$ = x$ + sep$
    FOR I = 1 TO max
        p = INSTR(z$, sep$)
        field$(I) = RTRIM$(LEFT$(z$, p - 1))
        z$ = RIGHT$(z$, LEN(z$) - p)
    NEXT
END SUB

SUB GetFutureDate (DaysToAdvance, mm, dd, yy, mm2, dd2, yy2) '#################################################

    mm2 = mm
    dd2 = dd
    yy2 = yy

    FOR lp = 1 TO DaysToAdvance

        dd2 = dd2 + 1

        SELECT CASE mm2
            CASE 1, 3, 5, 7, 8, 10, 12
                DaysInMonth = 31
            CASE 2
                VerifyLeapYear yy2, lr, DaysInMonth
            CASE ELSE
                DaysInMonth = 30
        END SELECT

        IF dd2 > DaysInMonth THEN
            dd2 = 1
            mm2 = mm2 + 1
            IF mm2 = 13 THEN
                mm2 = 1
                yy2 = yy2 + 1
            END IF
        END IF

    NEXT

END SUB

SUB GetLabelValue (lblfile$, lbl$, v$) '#######################################################
    v$ = "": n = FREEFILE: OPEN lblfile$ FOR INPUT AS #n
    DO UNTIL EOF(n)
        LINE INPUT #n, dta$: dta$ = RTRIM$(LTRIM$(dta$))
        IF LEFT$(dta$, 1) = "'" THEN dta$ = ""
        P = INSTR(dta$, "=")
        IF P THEN
            l$ = RTRIM$(LEFT$(dta$, P - 1))
            IF LCASE$(l$) = LCASE$(lbl$) THEN
                v$ = LTRIM$(RIGHT$(dta$, LEN(dta$) - P))
                EXIT DO
            END IF
        END IF
    LOOP: CLOSE #n
END SUB

SUB GetPer (FromNbr, pct, ToNbr) '###########################################
    ToNbr = FromNbr * pct
    ''PRINT ToNbr: END
    RemoveDecimal ToNbr
END SUB

SUB GetResp (v$, k$) '####################################################
    DO
        k$ = UCASE$(INKEY$)
        IF k$ <> "" THEN
            IF INSTR(v$, k$) THEN
                EXIT DO
            END IF
        END IF
    LOOP
END SUB

SUB LoadObjectData '######################################################

    LargestDiam = 0
    largestOrbit = 0
    DIM OrbitDays(MaxObjects)

    OPEN "SolarSystemData.tab" FOR INPUT AS #1

    DO UNTIL EOF(1)

        LINE INPUT #1, x$
        GetFields x$, CHR$(9), 8

        obj$ = field$(1)
        TestIfUseObject obj$, ok
        IF LCASE$(obj$) = "earth" THEN ok = 1 'force Earth into the list

        IF ok THEN

            I = I + 1
            IF LCASE$(obj$) = "earth" THEN
                earth# = I
            END IF
            PRINT I; obj$
            ''COLOR 7: PRINT I; field$(1)
            PlanetName$(I) = field$(1)
            FOR n = 2 TO 5
                RemoveChar field$(n), ","
            NEXT
            PlanetPeri(I) = VAL(field$(2))
            PlanetAphel(I) = VAL(field$(3))
            InitialAngle(I) = VAL(field$(5))
            RemoveChar field$(6), ","
            OrbitDays(I) = VAL(field$(6))
            PlanetDiam(I) = VAL(field$(7))
            IF PlanetDiam(I) > LargestDiam THEN LargestDiam = PlanetDiam(I)
            PlanetAngle(I) = 0 'planet angle = 0
            OrbitCount(I) = 0 'orbit count
            ''avg = (PlanetPeri(I) + PlanetAphel(I)) / 2
            avg = VAL(field$(4))
            IF avg > largestOrbit THEN largestOrbit = avg

        END IF

    LOOP

    CLOSE 1

    Planets# = I

    ErOR = OrbitDays(earth#) 'earth orbit days
    FOR I = 1 TO Planets#
        n = ErOR / OrbitDays(I)
        FixLTZeroExp n
        PRINT I; PlanetPeri(I); PlanetAphel(I)
        ObjectOrbitRatio(I) = n
    NEXT

    ''END

END SUB

SUB MainMenu '############################################################

    w = 80 * 8
    h = 25 * 16
    SCREEN _NEWIMAGE(w, h, 32)

    DO

        LoadObjectData

        GetLabelValue ParmsFile$, "ScreenHeight", x$: ScrnHeight = VAL(x$)
        GetLabelValue ParmsFile$, "ScreenWidth", x$: ScrnWidth = VAL(x$)

        GetLabelValue ParmsFile$, "OrbitDistOpt", OrbitDistOpt$
        GetLabelValue ParmsFile$, "PlanetIconSize", x$
        PlanetIconSize = VAL(x$)
        GetLabelValue ParmsFile$, "ScalePlanetIcon", x$
        ScalePlanetIcon = 0
        IF UCASE$(x$) = "Y" THEN ScalePlanetIcon = 1
        ''GetLabelValue ParmsFile$, "InnerPlanetDlyOpt", InnerPlanetDlyOpt$
        ''InnerPlanetDlyOpt$ = UCASE$(InnerPlanetDlyOpt$)
        GetLabelValue ParmsFile$, "ShowPlanetAngleLines", x$
        ShowPlanetAngleLines = 0
        IF UCASE$(x$) = "Y" THEN ShowPlanetAngleLines = 1
        GetLabelValue ParmsFile$, "StopAtDays", x$: StopAtDays = VAL(x$)
        GetLabelValue ParmsFile$, "StopAtOrbits", x$: StopAtOrbits = VAL(x$)
        GetLabelValue ParmsFile$, "UseInitalAngles", x$
        UseInitalAngles = 0: IF UCASE$(x$) = "Y" THEN UseInitalAngles = 1
        GetLabelValue ParmsFile$, "RandomAngleForNoAngle", x$
        RandomAngleForNoAngle = 0
        IF UCASE$(x$) = "Y" THEN RandomAngleForNoAngle = 1

        er$ = ""
        IF PlanetIconSize < 0 THEN
            er$ = "PlanetIconSize must be >= Zero"
        ELSE
            OrbitDistOpt$ = UCASE$(OrbitDistOpt$)
            IF OrbitDistOpt$ <> "S" AND OrbitDistOpt$ <> "E" THEN
                er$ = "OrbitDistOpt must be 'S' or 'E'"
            END IF
        END IF

        asciiCOLOR 7, 0: CLS
        ShowPgmTitle
        PRINT "Screen Width x Height:"; ScrnWidth; "x"; ScrnHeight
        PRINT
        PRINT "         Orbit Dist Opt: "; OrbitDistOpt$
        PRINT "       Planet Icon Size:"; PlanetIconSize
        PRINT " Scale planet icon size? "; YesNo$(ScalePlanetIcon)
        ''PRINT "   Inner Planet Dly Opt: "; InnerPlanetDlyOpt$
        PRINT "Show Planet Angle Lines: "; YesNo$(ShowPlanetAngleLines)
        PRINT "      Use Inital Angles? "; YesNo$(UseInitalAngles)
        PRINT "Random Angle For No Angle? "; YesNo$(RandomAngleForNoAngle)
        PRINT
        PRINT "  Stop at Days:"; StopAtDays
        PRINT "Stop at Orbits:"; StopAtOrbits
        PRINT
        PRINT STRING$(80, CHR$(196))
        asciiCOLOR 14, -1: PRINT er$
        PRINT
        asciiCOLOR 15, -1
        PRINT "  E = edit Parms file"
        IF er$ = "" THEN PRINT "  R = run"
        PRINT "ESC = exit program"

        V$ = "E" + CHR$(27)
        IF er$ = "" THEN V$ = V$ + "R"
        GetResp V$, k$

        SELECT CASE k$

            CASE CHR$(27): CLS: SYSTEM

            CASE "E": EditWithNotepad ParmsFile$

            CASE "R": EXIT SUB

        END SELECT

    LOOP


END SUB

SUB PausePgm (t$) '#########################################################

    'DATE$ format = MM-DD-YYYY
    mm = VAL(MID$(DATE$, 1, 2))
    dd = VAL(MID$(DATE$, 4, 2))
    yy = VAL(RIGHT$(DATE$, 4))
    ''LOCATE 1, 1: PRINT EarthDaysElapsed; "<"
    DaysToAdvance = EarthDaysElapsed
    GetFutureDate DaysToAdvance, mm, dd, yy, mm2, dd2, yy2
    x$ = "future date:" + STR$(mm2) + "-" + STR$(dd2) + "-" + STR$(yy2)
    p = ASCIIcols - LEN(x$)
    l = 3
    asciiCOLOR 9, -1: LOCATE l, p: PRINT x$

    li = ASCIIlines

    asciiCOLOR 14, -1
    LOCATE li: PRINT t$; " Press any key to continue..."
    DO UNTIL INKEY$ <> "": LOOP
    LOCATE li: PRINT SPACE$(80)

    asciiCOLOR 0, -1: LOCATE l, p: PRINT x$ 'erase it

END SUB

SUB PickRandomNumber (limit, n) '############################################
    q% = INT(RND * limit) + 1
    n = q%
END SUB

SUB RemoveChar (x$, c$) '#####################################################
    DO
        p = INSTR(x$, c$)
        IF p = 0 THEN EXIT DO
        x$ = LEFT$(x$, p - 1) + RIGHT$(x$, LEN(x$) - p)
    LOOP
END SUB

SUB RemoveDecimal (n) '###################################################
    x$ = LTRIM$(STR$(n))
    P = INSTR(x$, ".")
    IF P = 0 THEN EXIT SUB
    n = VAL(LEFT$(x$, P - 1))
END SUB

SUB ShowPgmTitle '#########################################################
    P = (80 - LEN(PgmTitle$)) / 2
    asciiCOLOR 15, 1
    LOCATE 1, 1: PRINT SPACE$(80)
    LOCATE 1, P: PRINT PgmTitle$
    asciiCOLOR 7, 0
END SUB

SUB ShowPlanetStats '#######################################################

    FOR I = 1 TO Planets#
        clr = clr + 1
        IF clr = 16 THEN clr = 1
        asciiCOLOR clr, -1
        LOCATE I, 1
        ''PRINT USING "### ### \         \ ###,### ###,###"; PlanetAngle(i); OrbitCount(i); PlanetName$(i); PlanetOrbitDly1(i); PlanetOrbitDly2(i)
        PRINT USING "### ### \         \"; OrbitCount(I); PlanetAngle(I); PlanetName$(I)
        IF I > 27 THEN EXIT FOR
    NEXT

END SUB

SUB TestIfUseObject (obj$, ok) '############################################
    ok = 0
    lk4$ = "/ObjectsToShow"
    OPEN ParmsFile$ FOR INPUT AS #2
    DO UNTIL EOF(2)
        LINE INPUT #2, x$
        x$ = LTRIM$(RTRIM$(x$))
        IF LEFT$(x$, 1) = "'" THEN x$ = ""
        IF x$ <> "" THEN
            IF UCASE$(x$) = UCASE$(lk4$) THEN
                found = 1
            ELSE
                IF found THEN
                    IF x$ = "/" THEN EXIT DO
                    IF UCASE$(obj$) = UCASE$(x$) THEN
                        ok = 1
                        EXIT DO
                    END IF
                END IF
            END IF
        END IF
    LOOP
    CLOSE 2
END SUB

SUB VerifyLeapYear (y, lr, d) '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    ff = FREEFILE
    OPEN "LeapYears.dat" FOR BINARY AS #ff
    x$ = " ": GET #ff, y, x$
    CLOSE ff
    lr = VAL(x$)
    d = 28: IF lr = 1 THEN d = 29
END SUB
