'===========================================================================
' Subject: SPACE SHIP THINGY (STAR TREK)      Date: 04-18-99 (21:56)       
'  Author: Ross Harper                        Code: QB, QBasic, PDS        
'  Origin: t.r.harper@btinternet.com        Packet: DEMOS.ABC
'===========================================================================
'' Hya!!
'' This was a little program I put together after watching Star Trek: First
'' Contact.  In Zefram Cochrane's ship, there was a little computer simulation
'' running showing his ship and all sorts of warp fields around it.  This
'' program was just a bit of fun at having a go. 
''
'' I might integrate it into a game someday...
''
'' Press 'H' whilst running to see the instructions
''
'' A challenge:  When you exceed Spatial Distortion Factor 7, the stars seem
'' to arrange themselves into horizontal lines whilst passing.  If anyone out
'' there in BASIC-land can sort this out, I'd love to hear from you!!
''
'' Lot's of love,
'' Wish you were here,
'' Ross!
''
'' Peachy512@yahoo.com
'' ICQ: 15844814
'' The Zax Bypass: http://members.xoom.com/Peachy512/Asylum/home.htm
''
DECLARE SUB box (q1!, a1!, q2!, a2!, col!)
DECLARE SUB xwing (col!)
DECLARE SUB definestars ()
DECLARE SUB drawstars (col!)
DECLARE SUB movestars ()
DECLARE SUB help ()
DECLARE SUB reinit ()
DECLARE SUB probe (col!)
DECLARE SUB vessel (col!)
DECLARE SUB cross (x!, y!, l!, col!)
DECLARE SUB ship (col!)
DECLARE SUB mainloop ()
DECLARE SUB pause (time!)
DECLARE SUB checkroutine ()
DECLARE SUB lfield (col!)
COMMON SHARED scx, scy, pfield, pfr, sp, fr, simr, defaultr, ves, warpcx1, warpcx2, warpcy, starx(), stary(), strs, wx1, wx2, wy, col
SCREEN 9
scx = 320: scy = 125: defaultr = 100: sp = 0: ves = 3: strs = 50
'warpcx1 = scx - 37: warpcx2 = scx + 37
warpcx1 = 320: warpcx2 = 320
warpcy = scy + 40
DIM starx(strs), stary(strs)
vessel (15)
definestars
drawstars (15)
mainloop

SUB allships
IF pfield = 1 AND col <> 0 THEN
        COLOR 2: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        COLOR 10: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (4)
END IF
IF pfield = 1 AND col = 0 THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (0)
END IF
END SUB

SUB box (q1, a1, q2, a2, col)
COLOR col
LINE (q1, a1)-(q2, a1)
LINE (q2, a1)-(q2, a2)
LINE (q2, a2)-(q1, a2)
LINE (q1, a2)-(q1, a1)
END SUB

SUB checkroutine
IF sp < 0 THEN sp = 0
IF sp > 9 THEN sp = 9
IF simr >= pfr THEN simr = 0
END SUB

SUB cross (x, y, l, col)
COLOR col
LINE (x - l, y - l)-(x + l, y + l)
LINE (x + l, y - l)-(x - l, y + l)
END SUB

SUB definestars
FOR n = 1 TO strs
        starx(n) = INT(RND * 640) + 1
        stary(n) = INT(RND * 350) + 1
NEXT n
END SUB

SUB drawstars (col)
FOR n = 1 TO strs
        ''IF col <> 0 THEN col = INT(RND * 7) + 8
        COLOR col
       
        PSET (starx(n), stary(n))
NEXT n
END SUB

SUB help
SCREEN 11
CLS
PRINT "Keys:"
PRINT
PRINT "Q        Move vessel up"
PRINT "A        Move vessel down"
PRINT "O        Move vessel left"
PRINT "P        Move vessel right"
PRINT "(This has no effect other than user preferences!)"
PRINT
PRINT "W        Generates / Disengages Physical Warp Field"
PRINT "(Logical warp field is generated also.)"
PRINT
PRINT "UP       Increase Logical Spatial Disturbance "
PRINT "DOWN     Decrease Logical Spatial Disturbance "
PRINT
PRINT "<        Move Logical Warp Field Generation Centre Outwards"
PRINT ">        Move Logical Warp Field Generation Centre Inwards"
PRINT "@        Move Logical Warp Field Generation Centre Up"
PRINT "/        Move Logical Warp Field Generation Centre Down"
PRINT
PRINT "C        Re-initialises screen"
PRINT "H        This help screen"
PRINT
PRINT "F1       Change vessel shape (type in number)"
PRINT
LOCATE 29, 1: PRINT "Press a key to continue": SLEEP: reinit
END SUB

SUB lfield (col)
COLOR 0
CIRCLE (scx, warpcy), defaultr + 101
CIRCLE (scx, warpcy), defaultr - 9
'CIRCLE (scx, warpcy), pfr + 1
COLOR col
fr = (sp * 10) + pfr + 1
LOCATE 2, 1: PRINT fr
CIRCLE (scx, warpcy), fr
END SUB

SUB mainloop
DO
COLOR 15
LOCATE 1, 1: PRINT "Spatial Distortian Factor "; sp
LOCATE 21, 1: PRINT "Physical: ": COLOR 2: LINE (170, 285)-(200, 285): COLOR 15
LOCATE 22, 1: PRINT "Logical:": COLOR 4: LINE (170, 300)-(200, 300): COLOR 15
LOCATE 23, 1: PRINT "Generation Centre:": CALL cross(185, 315, 5, 10): COLOR 15
a$ = LCASE$(INKEY$)
IF a$ = "h" THEN help: a$ = ""
IF a$ = "q" THEN vessel (0): scy = scy - 5: vessel (15)
IF a$ = "a" THEN vessel (0): scy = scy + 5: vessel (15)
IF a$ = "o" THEN vessel (0): scx = scx - 5: vessel (15)
IF a$ = "p" THEN vessel (0): scx = scx + 5: vessel (15)
IF a$ = "c" THEN reinit
IF a$ = CHR$(0) + ";" THEN
        LOCATE 1, 1: PRINT STRING$(80, " ")
        LOCATE 1, 1: INPUT "Vessel Number"; ves
        reinit
END IF

IF a$ = "," THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
                 CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CALL cross(warpcx1, warpcy, 5, 0)
                 CALL cross(warpcx2, warpcy, 5, 0)
                 warpcx1 = warpcx1 - 1: warpcx2 = warpcx2 + 1
                 CALL cross(warpcx1, warpcy, 5, 2)
                 CALL cross(warpcx2, warpcy, 5, 2)
END IF
IF a$ = "." THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
                 CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CALL cross(warpcx1, warpcy, 5, 0)
                 CALL cross(warpcx2, warpcy, 5, 0)
                 warpcx1 = warpcx1 + 1: warpcx2 = warpcx2 - 1
        CALL cross(warpcx1, warpcy, 5, 2)
        CALL cross(warpcx2, warpcy, 5, 2)
END IF
IF a$ = "'" THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
                 CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CALL cross(warpcx1, warpcy, 5, 0)
                 CALL cross(warpcx2, warpcy, 5, 0)
                 CIRCLE (scx, warpcy), fr
                 warpcy = warpcy - 1
                 CALL cross(warpcx1, warpcy, 5, 2)
                 CALL cross(warpcx2, warpcy, 5, 2)
END IF
IF a$ = "/" THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
                 CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
                 CALL cross(warpcx1, warpcy, 5, 0)
                 CALL cross(warpcx2, warpcy, 5, 0)
                 CIRCLE (scx, warpcy), fr
                 warpcy = warpcy + 1
                 CALL cross(warpcx1, warpcy, 5, 2)
                 CALL cross(warpcx2, warpcy, 5, 2)
END IF


IF a$ = "w" AND pfield = 0 THEN
        LOCATE 1, 1: PRINT "Physical Warp Field Generating"
        pause (1)
        LOCATE 1, 1: PRINT STRING$(80, " ")
        pfr = defaultr
        COLOR 2
        CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        lfield (4)
        COLOR 15: pfield = 1: a$ = "": simr = 0
END IF
IF a$ = "w" AND pfield = 1 THEN
        LOCATE 1, 1: PRINT "Physical Warp Field Disengaging"
        pause (1)
        LOCATE 1, 1: PRINT STRING$(80, " ")
        COLOR 0
        CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (0)
        COLOR 15: pfield = 0: vessel (15): a$ = "": pfr = defaultr
END IF
IF pfield = 1 THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        simr = simr + 5
        COLOR 2: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        vessel (15)
        movestars
        IF a$ = CHR$(0) + "h" THEN
                lfield (0)
                sp = sp + 1
                lfield (4)
        END IF
        IF a$ = CHR$(0) + "p" THEN
                lfield (0)
                sp = sp - 1
                lfield (4)
        END IF
END IF
checkroutine
LOOP
END SUB

SUB movestars
plus = sp ^ 2
drawstars (0)
FOR n = 1 TO strs
        stary(n) = stary(n) + plus
        IF stary(n) > 350 THEN stary(n) = -5: starx(n) = INT(RND * 640) + 1
NEXT n
drawstars (15)
END SUB

SUB pause (time)
starttime = INT(TIMER) + time
DO
LOOP UNTIL INT(TIMER) > starttime
END SUB

SUB probe (col)
IF col <> 0 THEN
        CALL cross(warpcx1, warpcy, 5, 10)
        CALL cross(warpcx2, warpcy, 5, 10)
END IF
IF col = 0 THEN
        CALL cross(warpcx1, warpcy, 5, 0)
        CALL cross(warpcx2, warpcy, 5, 0)
END IF
COLOR col
''probe hull
CIRCLE (scx, scy + 40), 35
CIRCLE (scx, scy + 40), 10
'' left nacelle
'LINE (scx - 35, scy + 55)-(scx - 35, scy + 25)
'LINE (scx - 40, scy + 55)-(scx - 40, scy + 25)
'LINE (scx - 36, scy + 56)-(scx - 39, scy + 56)
'LINE (scx - 36, scy + 24)-(scx - 39, scy + 24)
'' right nacelle
'LINE (scx + 35, scy + 55)-(scx + 35, scy + 25)
'LINE (scx + 40, scy + 55)-(scx + 40, scy + 25)
'LINE (scx + 36, scy + 56)-(scx + 39, scy + 56)
'LINE (scx + 36, scy + 24)-(scx + 39, scy + 24)
IF pfield = 1 AND col <> 0 THEN
        COLOR 2: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        COLOR 10: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (4)
END IF
IF pfield = 1 AND col = 0 THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (0)
END IF

END SUB

SUB reinit
SCREEN 9
CLS
vessel (15)
CALL cross(warpcx1, warpcy, 5, 2)
CALL cross(warpcx2, warpcy, 5, 2)
definestars
drawstars (15)
END SUB

SUB ship (col)
''warp centres
IF col <> 0 THEN
        CALL cross(warpcx1, warpcy, 5, 10)
        CALL cross(warpcx2, warpcy, 5, 10)
END IF
IF col = 0 THEN
        CALL cross(warpcx1, warpcy, 5, 0)
        CALL cross(warpcx2, warpcy, 5, 0)
END IF
COLOR col
''saucer section
CIRCLE (scx, scy), 30
CIRCLE (scx, scy), 5
'' middle
LINE (scx, scy + 22)-(scx, scy + 55)
'' bottom
LINE (scx - 5, scy + 55)-(scx + 5, scy + 55)
'' bottom to circle left
LINE (scx - 5, scy + 55)-(scx - 10, scy + 22)
'' bottom to circle right
LINE (scx + 5, scy + 55)-(scx + 10, scy + 22)
'' left nacelle pylon
LINE (scx - 6, scy + 50)-(scx - 35, scy + 47)
LINE (scx - 6, scy + 45)-(scx - 35, scy + 43)
'' right nacelle pylon
LINE (scx + 6, scy + 50)-(scx + 35, scy + 47)
LINE (scx + 6, scy + 45)-(scx + 35, scy + 43)
'' left nacelle
LINE (scx - 35, scy + 55)-(scx - 35, scy + 25)
LINE (scx - 40, scy + 55)-(scx - 40, scy + 25)
LINE (scx - 36, scy + 56)-(scx - 39, scy + 56)
LINE (scx - 36, scy + 24)-(scx - 39, scy + 24)
'' right nacelle
LINE (scx + 35, scy + 55)-(scx + 35, scy + 25)
LINE (scx + 40, scy + 55)-(scx + 40, scy + 25)
LINE (scx + 36, scy + 56)-(scx + 39, scy + 56)
LINE (scx + 36, scy + 24)-(scx + 39, scy + 24)
IF pfield = 1 AND col <> 0 THEN
        COLOR 2: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        COLOR 10: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (4)
END IF
IF pfield = 1 AND col = 0 THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (0)
END IF

END SUB

SUB vessel (col)
IF ves = 1 THEN ship (col)
IF ves = 2 THEN probe (col)
IF ves = 3 THEN xwing (col)
END SUB

SUB xwing (col)
IF col <> 0 THEN
        CALL cross(warpcx1, warpcy, 5, 10)
        CALL cross(warpcx2, warpcy, 5, 10)
END IF
IF col = 0 THEN
        CALL cross(warpcx1, warpcy, 5, 0)
        CALL cross(warpcx2, warpcy, 5, 0)
END IF
''fuselage
CALL box(scx - 5, scy + 50, scx + 5, scy + 30, col)
''nose
LINE (scx - 5, scy + 30)-(scx - 2, scy)
LINE (scx + 5, scy + 30)-(scx + 2, scy)
CIRCLE (scx, scy), 10, , , , 10 / 5
''left wing
LINE (scx - 5, scy + 50)-(scx - 50, scy + 45)
LINE (scx - 5, scy + 37)-(scx - 50, scy + 40)
''left gun
CALL box(scx - 50, scy + 45, scx - 51, scy + 20, col)

''right wing
LINE (scx + 5, scy + 50)-(scx + 50, scy + 45)
LINE (scx + 5, scy + 37)-(scx + 50, scy + 40)
''right gun
CALL box(scx + 50, scy + 45, scx + 51, scy + 20, col)


''fusial thrust engines
CALL box(scx - 5, scy + 45, scx - 8, scy + 55, col)
CALL box(scx + 5, scy + 45, scx + 8, scy + 55, col)
IF pfield = 1 AND col <> 0 THEN
        COLOR 2: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        COLOR 10: CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (4)
END IF
IF pfield = 1 AND col = 0 THEN
        COLOR 0: CIRCLE (warpcx1, warpcy), pfr: CIRCLE (warpcx2, warpcy), pfr
        CIRCLE (warpcx1, warpcy), simr: CIRCLE (warpcx2, warpcy), simr
        lfield (0)
END IF

END SUB
