Author Topic: Beyond The Stars (alpha)  (Read 6004 times)

0 Members and 1 Guest are viewing this topic.

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Beyond The Stars (alpha)
« on: January 15, 2020, 01:04:46 am »
With the inclusion of a crude game menu including a save game to file and load game from file I guess this is now a "complete" (not completed) game and can qualify as an alpha version. 

Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57.  
  58. sw = _DESKTOPWIDTH '                   native video with of syatem
  59. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  60. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  61. nw = 1920
  62.  
  63. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  64.  
  65. shw = sh / 20
  66. shn = sh / 40
  67. nh = 1080
  68.  
  69. tt = 0
  70. lcx = sw
  71. rcx = sw
  72. cp = 100
  73. h = 100
  74. ar = 0
  75. rng = 200
  76. slct = 0
  77. strng = ""
  78. strng0 = ""
  79. strng1 = ""
  80. src = 100
  81. dst = 100
  82. ord.src = 100
  83.  
  84. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  85.  
  86.  
  87. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  88. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  89. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  90. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  91.  
  92. StarNames
  93.  
  94. NewGame
  95.  
  96. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  97. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  98. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  99. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  100.  
  101. repeat = 1
  102.  
  103. WHILE repeat
  104.  
  105.     CLS
  106.  
  107.     PaintBackground
  108.  
  109.     PaintStars
  110.  
  111.     PaintFleet
  112.  
  113.     FOR it = 0 TO speed
  114.  
  115.         Update
  116.  
  117.         GetInput
  118.  
  119.         Player
  120.  
  121.         Computer
  122.  
  123.     NEXT
  124.  
  125.     _DISPLAY
  126.  
  127.  
  128.  
  129. SUB Computer
  130.  
  131.     IF paused = 0 THEN
  132.         id = INT(RND * 5) + 2
  133.         i = home(id)
  134.         IF star(i).o <> id THEN
  135.             FOR j = 0 TO 99
  136.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  137.             NEXT
  138.         END IF
  139.  
  140.         FOR p = 0 TO 3
  141.  
  142.             IF p = 0 THEN
  143.                 IF star(i).t > LL THEN
  144.                     away = 10000
  145.                     jay = 100
  146.                     FOR j = 0 TO 99
  147.                         IF star(j).o <> id THEN
  148.                             IF star(j).d > 0 THEN
  149.                                 star(j).d = star(j).d - 1
  150.                             ELSE
  151.                                 ok = 0
  152.                                 FOR k = 0 TO 99
  153.                                     IF star(k).o = id THEN
  154.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  155.                                         IF dist < 251 THEN
  156.                                             ok = 1
  157.                                             EXIT FOR
  158.                                         END IF
  159.                                     END IF
  160.                                 NEXT
  161.                                 IF ok = 1 THEN
  162.                                     dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  163.                                     IF dist < away THEN
  164.                                         IF LL > 299 THEN
  165.                                             away = dist
  166.                                             jay = j
  167.                                         ELSE
  168.                                             IF star(i).t > star(j).t * 3 + dist / 4 - star(j).p ^ 2 THEN
  169.                                                 away = dist
  170.                                                 jay = j
  171.                                             END IF
  172.                                         END IF
  173.                                     END IF
  174.                                 END IF
  175.                             END IF
  176.                         END IF
  177.                     NEXT
  178.                     IF LL > 299 AND star(i).t < star(jay).t * 3 THEN jay = 100
  179.                     IF jay < 100 THEN
  180.                         SendFleet i, jay, star(i).t / 2
  181.                         star(jay).d = 400
  182.                     END IF
  183.                 END IF
  184.             END IF
  185.  
  186.             IF p = 1 THEN
  187.                 sf2 = 100
  188.                 FOR i = 0 TO 99
  189.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  190.                         sf3 = star(i).t / 2.5
  191.                         FOR j = 0 TO 99
  192.                             IF star(j).d > 0 THEN
  193.                                 star(j).d = star(j).d - 1
  194.                             ELSE
  195.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  196.                                     FOR k = 0 TO 99
  197.                                         IF star(k).o = id THEN
  198.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  199.                                             IF dist <= 250 * ratio THEN
  200.                                                 sf1 = i
  201.                                                 sf2 = j
  202.                                                 EXIT FOR
  203.                                             END IF
  204.                                         END IF
  205.                                     NEXT
  206.                                 END IF
  207.                             END IF
  208.                         NEXT
  209.                         IF sf2 < 100 THEN EXIT FOR
  210.                     END IF
  211.                 NEXT
  212.                 IF sf2 < 100 THEN
  213.                     SendFleet sf1, sf2, sf3
  214.                     star(sf2).d = 400
  215.                     EXIT FOR
  216.                 END IF
  217.             END IF
  218.  
  219.             IF p = 2 THEN
  220.                 FOR i = 0 TO 99
  221.                     IF i <> home(id) AND star(i).o = id THEN
  222.                         IF star(i).t > 49 THEN
  223.                             ok = 1
  224.                             FOR j = 0 TO 99
  225.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  226.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  227.                                     IF dist <= 400 * ratio THEN
  228.                                         ok = 0
  229.                                         EXIT FOR
  230.                                     END IF
  231.                                 END IF
  232.                             NEXT
  233.                             IF ok = 1 THEN
  234.                                 SendFleet i, home(id), star(i).t
  235.                                 EXIT FOR
  236.                             END IF
  237.                         END IF
  238.                     END IF
  239.                 NEXT
  240.                 IF ok = 1 THEN EXIT FOR
  241.             END IF
  242.  
  243.             IF p = 3 THEN
  244.                 ok = 0
  245.                 FOR i = 0 TO 99
  246.                     IF i <> home(id) AND star(i).o = id THEN
  247.                         IF star(i).t > LL * 1.5 + star(i).p * 100 THEN
  248.                             ok = 1
  249.                             EXIT FOR
  250.                         END IF
  251.                     END IF
  252.                 NEXT
  253.                 IF ok = 1 THEN
  254.                     SendFleet i, home(id), star(i).t / 4
  255.                     EXIT FOR
  256.                 END IF
  257.             END IF
  258.  
  259.         NEXT
  260.  
  261.     END IF
  262.  
  263. SUB GamePanel
  264.     x1 = sw / 4
  265.     y1 = sh / 4
  266.     _DEST gp
  267.     COLOR 0, 8
  268.     CLS
  269.     _FONT ttf72
  270.     n$ = "Beyond The Stars"
  271.     l = _PRINTWIDTH(n$)
  272.     _PRINTSTRING ((960 - l) / 2, 12), n$, gp
  273.     LINE (80, 100)-(880, 100), 0
  274.     COLOR 0, 7
  275.     LINE (394, 180)-(566, 260), 7, BF
  276.     _PRINTSTRING (408, 184), "Save", gp
  277.     LINE (390, 360)-(570, 440), 7, BF
  278.     _PRINTSTRING (400, 364), "Load", gp
  279.     _FONT ttf36
  280.     COLOR 7, 8
  281.     n$ = "Right Click To Cancel"
  282.     l = _PRINTWIDTH(n$)
  283.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  284.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  285.     _DEST 0
  286.  
  287. SUB GetInput
  288.  
  289.     IF ch = CHR$(27) THEN repeat = 0
  290.     IF ch = "n" THEN NewGame
  291.     IF ch = "t" THEN tt = 1 - tt
  292.     IF ch = "p" THEN paused = 1 - paused
  293.     IF ch = "+" THEN
  294.         IF speed < 10 THEN speed = speed + 1
  295.     END IF
  296.     IF ch = "-" THEN
  297.         IF speed > 0 THEN speed = speed - 1
  298.     END IF
  299.     IF ch = "q" THEN QuickSave
  300.     IF ch = "l" THEN QuickRestore
  301.     ch = INKEY$
  302.  
  303.  
  304.     lclk = 0
  305.     rclk = 0
  306.  
  307.  
  308.         lmb = _MOUSEBUTTON(1)
  309.         rmb = _MOUSEBUTTON(2)
  310.  
  311.         x = _MOUSEX
  312.  
  313.         IF lmb AND lcx = sw THEN lcx = x
  314.         IF rmb AND rcx = sw THEN rcx = x
  315.  
  316.     WEND
  317.  
  318.     x = _MOUSEX
  319.     y = _MOUSEY
  320.  
  321.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  322.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  323.  
  324.     lcx = sw
  325.     rcx = sw
  326.  
  327.     IF rclk = 1 THEN
  328.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  329.             rclk = 0
  330.             oact = 0
  331.             pact = 0
  332.             gact = 0
  333.         ELSE
  334.             I = Identify
  335.             IF I = 100 THEN
  336.                 IF src = 100 THEN
  337.                     paused = 1 - paused
  338.                     ch = ""
  339.                 ELSE
  340.                     src = 100
  341.                 END IF
  342.                 rclk = 0
  343.             END IF
  344.         END IF
  345.     END IF
  346.  
  347.     IF lclk = 1 THEN
  348.         I = Identify
  349.         IF I = 100 AND src = 100 THEN
  350.             gact = 1
  351.             paused = 1
  352.         END IF
  353.     END IF
  354.  
  355.  
  356. FUNCTION Identify
  357.     ii = 100
  358.     FOR i = 0 TO 99
  359.         dx = star(i).x - x
  360.         dy = star(i).y - y
  361.         IF ABS(dx) <= star(i).s + 8 AND ABS(dy) <= star(i).s + 8 THEN
  362.             ii = i
  363.             EXIT FOR
  364.         END IF
  365.     NEXT
  366.     Identify = ii
  367.  
  368. SUB OrderPanel (i)
  369.     x1 = star(i).x - 420 * ratio
  370.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  371.     x2 = x1 + 400 * ratio
  372.     y1 = star(i).y
  373.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  374.     y2 = y1 + 225 * ratio
  375.     _DEST op
  376.     CLS 0, 8
  377.     COLOR 0, 8
  378.     _FONT ttf72
  379.     n$ = RTRIM$(star(i).n)
  380.     l = _PRINTWIDTH(n$)
  381.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  382.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  383.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  384.     COLOR 7, 8
  385.     _FONT ttf36
  386.     IF box = 0 THEN
  387.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  388.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  389.         LINE (xo, yo)-(xd, yd), 7, BF
  390.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  391.         LINE (xo, yo)-(xd, yd), 7, BF
  392.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  393.         LINE (xo, yo)-(xd, yd), 7, BF
  394.         n$ = RTRIM$(strng0)
  395.         COLOR 0, 7
  396.         _FONT ttf24
  397.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  398.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  399.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  400.     END IF
  401.     IF box = 1 THEN
  402.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  403.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  404.         LINE (xo, yo)-(xd, yd), 7, BF
  405.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  406.         LINE (xo, yo)-(xd, yd), 7, BF
  407.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  408.         LINE (xo, yo)-(xd, yd), 7, BF
  409.         n$ = RTRIM$(strng1)
  410.         COLOR 0, 7
  411.         _FONT ttf24
  412.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  413.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  414.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  415.     END IF
  416.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  417.     _DEST 0
  418.     oanx = x1: oany = y1
  419.  
  420. SUB PaintBackground
  421.     x = RND * sw
  422.     y = RND * sh
  423.     c = RND * 14 + 1
  424.     PSET (x, y), c
  425.     RANDOMIZE USING seed
  426.     FOR i = 1 TO 600 * ratio
  427.         x = RND * sw
  428.         y = RND * sh
  429.         c = RND * 14 + 1
  430.         PSET (x, y), c
  431.     NEXT
  432.  
  433. SUB PaintFleet
  434.     count = fltcnt
  435.     i = 0
  436.     WHILE count
  437.         IF fleet(i).o <> 0 THEN
  438.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  439.             count = count - 1
  440.         END IF
  441.         i = i + 1
  442.     WEND
  443.  
  444. SUB PaintStars
  445.  
  446.     'execute standing orders
  447.     FOR i = 0 TO 99
  448.         IF order(i).src <> 100 THEN
  449.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  450.                 order(i).src = 100
  451.             ELSE
  452.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 17
  453.                 IF star(i).t >= order(i).ovr THEN
  454.                     SendFleet order(i).src, order(i).dst, order(i).shp
  455.                 END IF
  456.             END IF
  457.         END IF
  458.     NEXT
  459.  
  460.     FOR i = 0 TO 99
  461.         c = star(i).c
  462.         x = star(i).x
  463.         y = star(i).y
  464.         o = star(i).o
  465.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  466.         COLOR 15
  467.         IF o > 0 THEN
  468.             PAINT (x, y), o + 8, c
  469.         END IF
  470.         _FONT ttf16
  471.         IF tt THEN
  472.             n$ = star(i).n
  473.             n$ = RTRIM$(n$)
  474.             l = _PRINTWIDTH(n$)
  475.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  476.         ELSE
  477.             n$ = STR$(star(i).t)
  478.             l = _PRINTWIDTH(n$)
  479.         END IF
  480.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  481.     NEXT
  482.  
  483.  
  484. SUB Player
  485.     'Add new order to standing orders
  486.     IF ord.src <> 100 THEN
  487.         i = ord.src
  488.         IF ord.shp = 0 THEN
  489.             order(i).src = 100
  490.         ELSE
  491.             order(i) = ord
  492.         END IF
  493.         src = 100
  494.         ord.src = 100
  495.     END IF
  496.  
  497.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  498.  
  499.         'If there is no source star see if we can get one
  500.         IF src = 100 THEN
  501.             i = Identify
  502.             IF i < 100 THEN WorldPanel i
  503.             IF lclk = 1 OR rclk = 1 THEN
  504.                 lclk = 0
  505.                 rclk = 0
  506.                 src = i
  507.             END IF
  508.         END IF
  509.  
  510.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  511.         IF src <> 100 THEN
  512.             c = 12
  513.             FOR i = 0 TO 99
  514.                 IF star(i).o = 1 THEN
  515.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  516.                     IF dist <= 251 * ratio THEN
  517.                         c = 10
  518.                         EXIT FOR
  519.                     END IF
  520.                 END IF
  521.             NEXT
  522.             i = Identify
  523.             IF i <> 100 THEN
  524.                 x = star(i).x
  525.                 y = star(i).y
  526.             END IF
  527.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  528.             LINE (star(src).x, star(src).y)-(x, y), c
  529.             n$ = STR$(INT(rang))
  530.             _FONT ttf16
  531.             _PRINTSTRING (x + 20, y), n$, 0
  532.         END IF
  533.  
  534.         'If we have a source star see if we clicked on a destination star
  535.         IF src <> 100 THEN
  536.             IF lclk = 1 OR rclk = 1 THEN
  537.                 i = Identify
  538.                 IF i = src THEN
  539.                     lclk = 0
  540.                     src = 100
  541.                     IF rclk = 1 THEN
  542.                         rclk = 0
  543.                         order(i).src = 100
  544.                     END IF
  545.                 ELSE
  546.                     IF i < 100 AND i <> src THEN
  547.                         IF lclk = 1 THEN
  548.                             lclk = 0
  549.                             FOR j = 0 TO 99
  550.                                 IF star(j).o = 1 THEN
  551.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  552.                                     IF dist <= 250 THEN
  553.                                         dst = i
  554.                                         pact = 1
  555.                                         EXIT FOR
  556.                                     END IF
  557.                                 END IF
  558.                             NEXT
  559.                         ELSE
  560.                             rclk = 0
  561.                             dst = i
  562.                             IF star(i).o = 1 THEN
  563.                                 oact = 1
  564.                             END IF
  565.                         END IF
  566.                     END IF
  567.                 END IF
  568.             END IF
  569.         END IF
  570.     END IF
  571.  
  572.     'If the game panel is active
  573.     IF gact = 1 THEN
  574.         GamePanel
  575.         IF lclk = 1 THEN
  576.             x1 = sw / 4 + 394: x2 = x1 + 172: y1 = sh / 4 + 180: y2 = y1 + 80
  577.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN SaveGame: gact = 0
  578.             x1 = sw / 4 + 390: x2 = x1 + 180: y1 = sh / 4 + 360: y2 = y1 + 80
  579.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN LoadGame: gact = 0
  580.         END IF
  581.     END IF
  582.  
  583.     'If the star standing orders panel is active
  584.     IF oact = 1 THEN
  585.  
  586.         IF star(src).o = 1 THEN
  587.             OrderPanel dst
  588.         END IF
  589.  
  590.         IF rclk = 1 THEN oact = 0
  591.  
  592.         IF box = 0 THEN
  593.             tmp$ = RTRIM$(strng0)
  594.         ELSE
  595.             tmp$ = RTRIM$(strng1)
  596.         END IF
  597.  
  598.         IF lclk = 1 THEN
  599.  
  600.             x1 = oanx: x2 = oanx + 400 * ratio
  601.             y1 = oany: y2 = oany + 540 * ratio
  602.  
  603.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  604.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  605.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  606.                     IF box = 0 THEN
  607.                         n$ = RTRIM$(strng0)
  608.                         l = LEN(n$)
  609.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  610.                     ELSE
  611.                         n$ = RTRIM$(strng1)
  612.                         l = LEN(n$)
  613.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  614.                     END IF
  615.                 END IF
  616.             END IF
  617.  
  618.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  619.  
  620.                 IF box = 0 THEN
  621.  
  622.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  623.                         ord.ovr = INT(VAL(strng0))
  624.                         box = 1
  625.                     END IF
  626.  
  627.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  628.                         strng0 = ""
  629.                     END IF
  630.  
  631.                 ELSE
  632.  
  633.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  634.                         IF INT(VAL(strng1)) > ord.ovr THEN
  635.                             strng1 = ""
  636.                         ELSE
  637.                             box = 0
  638.                             oact = 0
  639.                             ord.src = src
  640.                             ord.dst = dst
  641.                             ord.shp = VAL(strng1)
  642.                             strng0 = ""
  643.                             strng1 = ""
  644.                         END IF
  645.                     END IF
  646.  
  647.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  648.                         strng0 = ""
  649.                         strng1 = ""
  650.                         box = 0
  651.                     END IF
  652.  
  653.                 END IF
  654.  
  655.             END IF
  656.         END IF
  657.         x1 = 10000: y1 = 10000
  658.  
  659.     END IF
  660.  
  661.  
  662.     'If the fleet send panel is active
  663.     IF pact = 1 THEN
  664.         IF rclk = 1 THEN pact = 0
  665.         IF star(src).o = 1 THEN
  666.             ShowPanel dst
  667.         END IF
  668.         IF lclk = 1 THEN
  669.             tmp$ = RTRIM$(strng)
  670.  
  671.             x1 = panx: x2 = panx + 400 * ratio
  672.             y1 = pany: y2 = pany + 540 * ratio
  673.  
  674.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  675.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  676.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  677.                     strng = tmp$ + STR$(dig)
  678.                 END IF
  679.             END IF
  680.  
  681.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  682.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  683.                     pact = 0
  684.                     value = star(src).t
  685.                     SendFleet src, dst, value
  686.                     src = 100
  687.                 END IF
  688.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  689.                     pact = 0
  690.                     value = star(src).t / 2
  691.                     SendFleet src, dst, value
  692.                     src = 100
  693.                 END IF
  694.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  695.                     pact = 0
  696.                     value = star(src).t / 3
  697.                     SendFleet src, dst, value
  698.                     src = 100
  699.                 END IF
  700.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  701.                     strng = ""
  702.                 END IF
  703.             END IF
  704.  
  705.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  706.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  707.                     value = VAL(strng)
  708.                     strng = ""
  709.                     pact = 0
  710.                     IF value <= star(src).t AND star(src).t <> o THEN
  711.                         SendFleet src, dst, value
  712.                     END IF
  713.                     src = 100
  714.                 END IF
  715.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  716.                     pact = 0
  717.                     src = 100
  718.                     strng = ""
  719.                 END IF
  720.             END IF
  721.         END IF
  722.     END IF
  723.  
  724. SUB QuickSave
  725.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  726.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  727.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  728.     qfltcnt = fltcnt
  729.     qLL = LL
  730.  
  731. SUB QuickRestore
  732.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  733.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  734.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  735.     fltcnt = qfltcnt
  736.     LL = qLL
  737.     paused = 1
  738.  
  739. SUB LoadGame
  740.     OPEN "savegame.sav" FOR BINARY AS #2
  741.     GET #2, , star()
  742.     GET #2, , order()
  743.     GET #2, , fleet()
  744.     GET #2, , home()
  745.     GET #2, , fltcnt
  746.     GET #2, , LL
  747.     CLOSE #2
  748.     PRINT "Game Loaded"
  749.  
  750. SUB SaveGame
  751.     OPEN "savegame.sav" FOR BINARY AS #1
  752.     CLOSE #1
  753.     KILL "savegame.sav"
  754.     OPEN "savegame.sav" FOR BINARY AS #1
  755.     PUT #1, , star()
  756.     PUT #1, , order()
  757.     PUT #1, , fleet()
  758.     PUT #1, , home()
  759.     PUT #1, , fltcnt
  760.     PUT #1, , LL
  761.     CLOSE #1
  762.     PRINT "Game Saved"
  763.  
  764. SUB SendFleet (src, dst, ships)
  765.     IF fltcnt < 2000 THEN
  766.         FOR i = 0 TO 1999
  767.             IF fleet(i).o = 0 THEN
  768.                 fleet(i).o = star(src).o
  769.                 fleet(i).d = dst
  770.                 fleet(i).x1 = star(src).x
  771.                 fleet(i).y1 = star(src).y
  772.                 fleet(i).x2 = star(dst).x
  773.                 fleet(i).y2 = star(dst).y
  774.                 fleet(i).t = ships
  775.                 star(src).t = star(src).t - ships
  776.                 fltcnt = fltcnt + 1
  777.                 EXIT FOR
  778.             END IF
  779.         NEXT
  780.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 2
  781.     END IF
  782.  
  783. SUB ShowPanel (i)
  784.     x1 = star(i).x - 420 * ratio
  785.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  786.     x2 = x1 + 400 * ratio
  787.     y1 = star(i).y
  788.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  789.     y2 = y1 + 540 * ratio
  790.     _DEST sp
  791.     CLS 0, 8
  792.     COLOR 0, 8
  793.     _FONT ttf72
  794.     n$ = RTRIM$(star(src).n)
  795.     l = _PRINTWIDTH(n$)
  796.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  797.     n$ = "to"
  798.     l = _PRINTWIDTH(n$)
  799.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  800.     n$ = RTRIM$(star(dst).n)
  801.     l = _PRINTWIDTH(n$)
  802.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  803.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  804.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  805.     n$ = RTRIM$(strng)
  806.     l = _PRINTWIDTH(n$)
  807.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  808.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  809.     LINE (xo, yo)-(xd, yd), 7, BF
  810.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  811.     LINE (xo, yo)-(xd, yd), 7, BF
  812.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  813.     LINE (xo, yo)-(xd, yd), 7, BF
  814.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  815.     LINE (xo, yo)-(xd, yd), 7, BF
  816.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  817.     LINE (xo, yo)-(xd, yd), 7, BF
  818.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  819.     LINE (xo, yo)-(xd, yd), 7, BF
  820.     _FONT ttf24
  821.     COLOR 7, 8
  822.     n$ = RTRIM$(STR$(star(src).t))
  823.     l = _PRINTWIDTH(n$)
  824.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  825.     n$ = RTRIM$(STR$(star(dst).t))
  826.     l = _PRINTWIDTH(n$)
  827.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  828.     _FONT ttf16
  829.     COLOR 0, 7
  830.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  831.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  832.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  833.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  834.     _FONT ttf72
  835.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  836.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  837.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  838.     panx = x1: pany = y1
  839.     _DEST 0
  840.  
  841. SUB Update
  842.     IF paused = 0 THEN
  843.         RANDOMIZE TIMER
  844.         FOR i = 0 TO 99
  845.             r = INT(RND * 60)
  846.             IF r < star(i).p THEN
  847.                 IF star(i).o > 0 THEN
  848.                     star(i).t = star(i).t + 1
  849.                 ELSE
  850.                     IF INT(RND * 10) < 3 THEN
  851.                         star(i).t = star(i).t + 1
  852.                     END IF
  853.                 END IF
  854.             END IF
  855.         NEXT
  856.  
  857.         count = fltcnt
  858.         i = 0
  859.         WHILE count
  860.             IF fleet(i).o <> 0 THEN
  861.                 count = count - 1
  862.                 IF fleet(i).x2 > fleet(i).x1 THEN
  863.                     fleet(i).x1 = fleet(i).x1 + 1
  864.                 END IF
  865.                 IF fleet(i).x2 < fleet(i).x1 THEN
  866.                     fleet(i).x1 = fleet(i).x1 - 1
  867.                 END IF
  868.                 IF fleet(i).y2 > fleet(i).y1 THEN
  869.                     fleet(i).y1 = fleet(i).y1 + 1
  870.                 END IF
  871.                 IF fleet(i).y2 < fleet(i).y1 THEN
  872.                     fleet(i).y1 = fleet(i).y1 - 1
  873.                 END IF
  874.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  875.                     dest = fleet(i).d
  876.                     IF star(dest).o = fleet(i).o THEN
  877.                         star(dest).t = star(dest).t + fleet(i).t
  878.                         fleet(i).o = 0
  879.                         fltcnt = fltcnt - 1
  880.                     ELSE
  881.                         o = star(dest).o
  882.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  883.                             k = 100
  884.                             shortest = 10000
  885.                             FOR j = 0 TO 99
  886.                                 IF star(j).o = o THEN
  887.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  888.                                     IF dist < shortest THEN
  889.                                         shortest = dist
  890.                                         k = j
  891.                                     END IF
  892.                                 END IF
  893.                             NEXT
  894.                             SendFleet dest, k, star(dest).t * 0.90
  895.                             star(dest).t = 0
  896.                             star(dest).o = fleet(i).o
  897.                             star(dest).t = fleet(i).t
  898.                             star(dest).o = fleet(i).o
  899.                             fleet(i).o = 0
  900.                             fltcnt = fltcnt - 1
  901.                         ELSE
  902.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  903.                                 alive = 1
  904.                                 WHILE alive
  905.                                     alive = 0
  906.                                     damorg = fleet(i).t / 10 + 1
  907.                                     damdst = star(dest).t / 8 + 1
  908.                                     fleet(i).t = fleet(i).t - damdst
  909.                                     star(dest).t = star(dest).t - damorg
  910.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  911.                                         alive = 1
  912.                                     END IF
  913.                                 WEND
  914.                                 IF star(dest).t < 1 THEN
  915.                                     star(dest).t = fleet(i).t
  916.                                     star(dest).o = fleet(i).o
  917.                                 END IF
  918.                                 fleet(i).o = 0
  919.                                 fltcnt = fltcnt - 1
  920.                             ELSE
  921.                                 k = 100
  922.                                 shortest = 10000
  923.                                 FOR j = 0 TO 99
  924.                                     IF star(j).o = fleet(i).o THEN
  925.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  926.                                         IF dist < shortest THEN
  927.                                             shortest = dist
  928.                                             k = j
  929.                                         END IF
  930.                                     END IF
  931.                                 NEXT
  932.                                 IF k < 100 THEN
  933.                                     fleet(i).x2 = star(k).x
  934.                                     fleet(i).y2 = star(k).y
  935.                                     fleet(i).d = k
  936.                                 ELSE
  937.                                     fleet(i).o = 0
  938.                                     fltcnt = fltcnt - 1
  939.                                 END IF
  940.                             END IF
  941.                         END IF
  942.                     END IF
  943.                 END IF
  944.             END IF
  945.             i = i + 1
  946.         WEND
  947.     END IF
  948.  
  949. SUB WorldPanel (i)
  950.     x1 = star(i).x - 420 * ratio
  951.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  952.     x2 = x1 + 400 * ratio
  953.     y1 = star(i).y
  954.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  955.     y2 = y1 + 225 * ratio
  956.     _DEST wp
  957.     CLS 0, 8
  958.     COLOR 0, 8
  959.     _FONT ttf72
  960.     n$ = RTRIM$(star(i).n)
  961.     l = _PRINTWIDTH(n$)
  962.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  963.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  964.     COLOR 7, 8
  965.     _FONT ttf36
  966.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  967.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  968.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  969.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  970.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  971.     n$ = "NO"
  972.     FOR j = 0 TO 99
  973.         IF star(i).o <> star(j).o THEN
  974.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  975.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  976.                 IF dist <= 250 THEN
  977.                     n$ = "YES"
  978.                     EXIT FOR
  979.                 END IF
  980.             END IF
  981.         END IF
  982.     NEXT
  983.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  984.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  985.     _DEST 0
  986.  
  987. SUB NewGame
  988.     DIM k AS INTEGER
  989.     DIM r AS INTEGER
  990.     DIM dx AS INTEGER
  991.     DIM dy AS INTEGER
  992.     DIM n AS STRING * 10
  993.     paused = 1
  994.     FOR i = 0 TO 999
  995.         fleet(i).o = 0
  996.     NEXT
  997.     slct = 0
  998.     fltcnt = 0
  999.     LL = 0
  1000.     seed = RND * 1000
  1001.     FOR i = 0 TO 99
  1002.         k = 1
  1003.         WHILE k
  1004.             k = 0
  1005.             x = RND * (sw - sww) + swn
  1006.             y = RND * (sh - shw) + shn
  1007.             r = INT(RND * 200)
  1008.             n = names(r)
  1009.             FOR j = 0 TO i - 1
  1010.                 dx = x - star(j).x
  1011.                 dy = y - star(j).y
  1012.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1013.                     k = 1
  1014.                 END IF
  1015.                 IF n = star(j).n THEN
  1016.                     k = 1
  1017.                 END IF
  1018.             NEXT
  1019.         WEND
  1020.         star(i).n = n
  1021.         star(i).x = x
  1022.         star(i).y = y
  1023.         star(i).c = RND * 6 + 9
  1024.         star(i).s = RND * 5
  1025.         star(i).o = 0
  1026.         star(i).p = star(i).s + (RND * 5) + 3
  1027.         star(i).t = 0
  1028.         order(i).src = 100
  1029.     NEXT
  1030.     FOR i = 1 TO 6
  1031.         ok = 0
  1032.         WHILE (ok < 1)
  1033.             ok = 1
  1034.             j = RND * 100
  1035.             FOR k = 1 TO i - 1
  1036.                 dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1037.                 IF dist < 500 * ratio THEN
  1038.                     ok = 0
  1039.                     EXIT FOR
  1040.                 END IF
  1041.             NEXT
  1042.             IF ok = 1 THEN
  1043.                 ok = -1
  1044.                 FOR k = 0 TO 99
  1045.                     dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1046.                     IF dist <= 200 THEN ok = ok + 1
  1047.                     IF ok = 2 THEN EXIT FOR
  1048.                 NEXT
  1049.             END IF
  1050.         WEND
  1051.         home(i) = j
  1052.         star(j).o = i
  1053.         star(j).p = 10
  1054.         star(j).t = 100
  1055.         star(j).s = 4
  1056.     NEXT
  1057.     star(home(1)).n = "Sol"
  1058.     star(home(1)).c = 14
  1059.     QuickSave
  1060.  
  1061. ' A lot of star names I made up
  1062.  
  1063. SUB StarNames
  1064.     names(0) = "Acamar"
  1065.     names(1) = "Arcab"
  1066.     names(2) = "Acrux"
  1067.     names(3) = "Adhara"
  1068.     names(4) = "Arneb"
  1069.     names(5) = "Antares"
  1070.     names(6) = "Arcturus"
  1071.     names(7) = "Atria"
  1072.     names(8) = "Beid"
  1073.     names(9) = "Betelgeuse"
  1074.     names(10) = "Botein"
  1075.     names(11) = "Beemim"
  1076.     names(12) = "Bellatrix"
  1077.     names(13) = "Bharani"
  1078.     names(14) = "Biham"
  1079.     names(15) = "Brachium"
  1080.     names(16) = "Canopus"
  1081.     names(17) = "Capella"
  1082.     names(18) = "Castor"
  1083.     names(19) = "Chara"
  1084.     names(20) = "Cursa"
  1085.     names(21) = "Copernicus"
  1086.     names(22) = "Chalawan"
  1087.     names(23) = "Chertan"
  1088.     names(24) = "Dabih"
  1089.     names(25) = "Dalim"
  1090.     names(26) = "Deneb"
  1091.     names(27) = "Denebola"
  1092.     names(28) = "Diadem"
  1093.     names(29) = "Diphda"
  1094.     names(30) = "Dschubba"
  1095.     names(31) = "Dziban"
  1096.     names(32) = "Edasich"
  1097.     names(33) = "Electra"
  1098.     names(34) = "Elgafar"
  1099.     names(35) = "Elkurud"
  1100.     names(36) = "Elnath"
  1101.     names(37) = "Eltanin"
  1102.     names(38) = "Enif"
  1103.     names(39) = "Errai"
  1104.     names(40) = "Fafnir"
  1105.     names(41) = "Fang"
  1106.     names(42) = "Fawaris"
  1107.     names(43) = "Felis"
  1108.     names(44) = "Fomalhaut"
  1109.     names(45) = "Fulu"
  1110.     names(46) = "Fumal"
  1111.     names(47) = "Furud"
  1112.     names(48) = "Garnet"
  1113.     names(49) = "Giausar"
  1114.     names(50) = "Gienah"
  1115.     names(51) = "Ginan"
  1116.     names(52) = "Gomeisa"
  1117.     names(53) = "Graffias"
  1118.     names(54) = "Grumium"
  1119.     names(55) = "Gudja"
  1120.     names(56) = "Hadar"
  1121.     names(57) = "Haedus"
  1122.     names(58) = "Hamal"
  1123.     names(59) = "Hassaleh"
  1124.     names(60) = "Hatysa"
  1125.     names(61) = "Helvetios"
  1126.     names(62) = "Heze"
  1127.     names(63) = "Homan"
  1128.     names(64) = "Iklil"
  1129.     names(65) = "Imai"
  1130.     names(66) = "Intercrus"
  1131.     names(67) = "Izar"
  1132.     names(68) = "Iccar"
  1133.     names(69) = "Inar"
  1134.     names(70) = "Iaeth"
  1135.     names(71) = "Imaous"
  1136.     names(72) = "Jabbah"
  1137.     names(73) = "Jishui"
  1138.     names(74) = "Jax"
  1139.     names(75) = "Jalae"
  1140.     names(76) = "Jewel"
  1141.     names(77) = "Jumbo"
  1142.     names(78) = "Jerue"
  1143.     names(79) = "Jabear"
  1144.     names(80) = "Kakkab"
  1145.     names(81) = "Kang"
  1146.     names(82) = "Kekouan"
  1147.     names(83) = "Keid"
  1148.     names(84) = "Kitalpha"
  1149.     names(85) = "Kochab"
  1150.     names(86) = "Kolob"
  1151.     names(87) = "Kobol"
  1152.     names(88) = "Larawag"
  1153.     names(89) = "Lesath"
  1154.     names(90) = "Libertas"
  1155.     names(91) = "Lich"
  1156.     names(92) = "Lilly"
  1157.     names(93) = "Laddel"
  1158.     names(94) = "Luminous"
  1159.     names(95) = "Lasacious"
  1160.     names(96) = "Mizar"
  1161.     names(97) = "Markab"
  1162.     names(98) = "Matar"
  1163.     names(99) = "Mintaka"
  1164.     names(100) = "Meleph"
  1165.     names(101) = "Menkar"
  1166.     names(102) = "Merga"
  1167.     names(103) = "Merope"
  1168.     names(104) = "Nahn"
  1169.     names(105) = "Naos"
  1170.     names(106) = "Nashira"
  1171.     names(107) = "Navi"
  1172.     names(108) = "Nekkar"
  1173.     names(109) = "Nembus"
  1174.     names(110) = "Nihal"
  1175.     names(111) = "Nunki"
  1176.     names(112) = "Ogma"
  1177.     names(113) = "Okab"
  1178.     names(114) = "Ohmy"
  1179.     names(115) = "Oragami"
  1180.     names(116) = "Origen"
  1181.     names(117) = "Omanii"
  1182.     names(118) = "Obytewa"
  1183.     names(119) = "Oglok"
  1184.     names(120) = "Phact"
  1185.     names(121) = "Pherkad"
  1186.     names(122) = "Pleione"
  1187.     names(122) = "Polaris"
  1188.     names(123) = "Pollux"
  1189.     names(124) = "Procyon"
  1190.     names(125) = "Proxima"
  1191.     names(126) = "Polis"
  1192.     names(127) = "Quaint"
  1193.     names(128) = "Quazzat"
  1194.     names(129) = "Quetzal"
  1195.     names(130) = "Qussol"
  1196.     names(131) = "Quella"
  1197.     names(132) = "Quyaeo"
  1198.     names(133) = "Ququdas"
  1199.     names(134) = "Quekak"
  1200.     names(135) = "Rasalas"
  1201.     names(136) = "Regor"
  1202.     names(137) = "Regulus"
  1203.     names(138) = "Rigel"
  1204.     names(139) = "Revati"
  1205.     names(140) = "Rotenev"
  1206.     names(141) = "Rukbat"
  1207.     names(142) = "Rastaban"
  1208.     names(143) = "Sabik"
  1209.     names(144) = "Sadr"
  1210.     names(145) = "Saiph"
  1211.     names(146) = "Sargas"
  1212.     names(147) = "Sarin"
  1213.     names(148) = "Syrma"
  1214.     names(149) = "Spica"
  1215.     names(150) = "Sirius"
  1216.     names(151) = "Tarazed"
  1217.     names(152) = "Taygeta"
  1218.     names(153) = "Tejat"
  1219.     names(154) = "Thabit"
  1220.     names(155) = "Thuban"
  1221.     names(156) = "Tiaki"
  1222.     names(157) = "Toliman"
  1223.     names(158) = "Torcular"
  1224.     names(157) = "Umala"
  1225.     names(158) = "Ulatte"
  1226.     names(159) = "Ubbessa"
  1227.     names(160) = "Unoless"
  1228.     names(161) = "Umaddem"
  1229.     names(162) = "Ummbra"
  1230.     names(162) = "Uniqu"
  1231.     names(163) = "Uzzaal"
  1232.     names(164) = "Vega"
  1233.     names(165) = "Veritate"
  1234.     names(166) = "Vindetrix"
  1235.     names(167) = "Vedas"
  1236.     names(168) = "Vergg"
  1237.     names(169) = "Vacant"
  1238.     names(170) = "Vucae"
  1239.     names(171) = "Vicar"
  1240.     names(172) = "Wasat"
  1241.     names(173) = "Wazn"
  1242.     names(174) = "Wezen"
  1243.     names(175) = "Waiten"
  1244.     names(176) = "Wachar"
  1245.     names(177) = "Wheelz"
  1246.     names(178) = "Whatsp"
  1247.     names(179) = "Wassand"
  1248.     names(180) = "Xenno"
  1249.     names(181) = "Xyphod"
  1250.     names(182) = "Xu"
  1251.     names(183) = "Xaal"
  1252.     names(184) = "Xyross"
  1253.     names(185) = "Xiggot"
  1254.     names(186) = "Xirrks"
  1255.     names(187) = "Yed"
  1256.     names(188) = "Yildun"
  1257.     names(189) = "Yundun"
  1258.     names(190) = "Yavyo"
  1259.     names(191) = "Yotrac"
  1260.     names(192) = "Yxzoqu"
  1261.     names(193) = "Ynnot"
  1262.     names(194) = "Zaniah"
  1263.     names(195) = "Zaurak"
  1264.     names(196) = "Zhang"
  1265.     names(197) = "Zibal"
  1266.     names(198) = "Zosma"
  1267.     names(199) = "Zuben"
  1268.  
  1269.  
  1270.  
  1271.  
My name is Michael, but you can call me Mike :)

Offline Pete

  • Forum Resident
  • Posts: 2361
  • Cuz I sez so, varmint!
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #1 on: January 15, 2020, 02:31:20 am »
Neat star map...

Rating: I gave it 5 stars... and one of them was half filled in! :D

Kidding aside, I really liked it!

Pete
Want to learn how to write code on cave walls? https://www.tapatalk.com/groups/qbasic/qbasic-f1/

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #2 on: January 15, 2020, 03:18:24 am »
Neat star map...

Rating: I gave it 5 stars... and one of them was half filled in! :D

Kidding aside, I really liked it!

Pete

Well I'll be darned, I do believe that thar there was a genuine compliment! :)
My name is Michael, but you can call me Mike :)

Offline Kazman

  • Newbie
  • Posts: 14
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #3 on: January 15, 2020, 05:52:05 am »
I'm going to test the game right now! :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #4 on: January 15, 2020, 11:08:59 am »
I'm going to test the game right now! :)

Cool! Testers are different from players. Testers are expected to make a report. Testers that do not report are downgraded to player, LOL. :)
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #5 on: January 17, 2020, 02:30:03 pm »
When in a hurry it was too easy to miss with a left mouse click and bring up the game panel by accident. Now a left click on the screen will only bring up the game panel if the game is paused. So when the game is not paused just a right click on the screen to pause the game and a left click to bring up the game panel. Also there is a big improvement to the AI.

Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57.  
  58. sw = _DESKTOPWIDTH '                   native video with of syatem
  59. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  60. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  61. nw = 1920
  62.  
  63. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  64.  
  65. shw = sh / 20
  66. shn = sh / 40
  67. nh = 1080
  68.  
  69. tt = 0
  70. lcx = sw
  71. rcx = sw
  72. cp = 100
  73. h = 100
  74. ar = 0
  75. rng = 200
  76. slct = 0
  77. strng = ""
  78. strng0 = ""
  79. strng1 = ""
  80. src = 100
  81. dst = 100
  82. ord.src = 100
  83.  
  84. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  85.  
  86.  
  87. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  88. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  89. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  90. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  91.  
  92. StarNames
  93.  
  94. NewGame
  95.  
  96. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  97. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  98. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  99. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  100.  
  101. repeat = 1
  102.  
  103. WHILE repeat
  104.  
  105.     CLS
  106.  
  107.     PaintBackground
  108.  
  109.     PaintStars
  110.  
  111.     PaintFleet
  112.  
  113.     FOR it = 0 TO speed
  114.  
  115.         Update
  116.  
  117.         GetInput
  118.  
  119.         Player
  120.  
  121.         Computer
  122.  
  123.     NEXT
  124.  
  125.     _DISPLAY
  126.  
  127.  
  128.  
  129. SUB Computer
  130.  
  131.     IF paused = 0 THEN
  132.         id = INT(RND * 5) + 2
  133.         i = home(id)
  134.         IF star(i).o <> id THEN
  135.             FOR j = 0 TO 99
  136.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  137.             NEXT
  138.         END IF
  139.  
  140.         FOR p = 0 TO 3
  141.  
  142.             IF p = 0 THEN
  143.                 IF star(i).t > LL THEN
  144.                     away = 10000
  145.                     FOR j = 0 TO 99
  146.                         IF star(j).o <> id THEN
  147.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  148.                             IF dist < away THEN
  149.                                 away = dist
  150.                                 o = star(j).o
  151.                             END IF
  152.                         END IF
  153.                     NEXT
  154.                     away = 10000
  155.                     jay = 100
  156.                     FOR j = 0 TO 99
  157.                         dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  158.                         IF star(j).o <> id AND star(j).o = o AND star(i).t > star(j).t * 5 + (dist * (o > 0)) THEN
  159.                             IF star(j).d > 0 THEN
  160.                                 star(j).d = star(j).d - 1
  161.                             ELSE
  162.                                 FOR k = 0 TO 99
  163.                                     IF star(k).o = id THEN
  164.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  165.                                         IF dist <= 250 THEN
  166.                                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  167.                                             IF dist < away THEN
  168.                                                 away = dist
  169.                                                 jay = j
  170.                                             END IF
  171.                                         END IF
  172.                                     END IF
  173.                                 NEXT
  174.                             END IF
  175.                         END IF
  176.                     NEXT
  177.                     IF jay < 100 THEN
  178.                         SendFleet i, jay, star(i).t / 3
  179.                         star(jay).d = 400
  180.                     END IF
  181.                 END IF
  182.             END IF
  183.  
  184.             IF p = 1 THEN
  185.                 sf2 = 100
  186.                 FOR i = 0 TO 99
  187.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  188.                         sf3 = star(i).t / 2.5
  189.                         FOR j = 0 TO 99
  190.                             IF star(j).d > 0 THEN
  191.                                 star(j).d = star(j).d - 1
  192.                             ELSE
  193.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  194.                                     FOR k = 0 TO 99
  195.                                         IF star(k).o = id THEN
  196.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  197.                                             IF dist <= 250 * ratio THEN
  198.                                                 sf1 = i
  199.                                                 sf2 = j
  200.                                                 EXIT FOR
  201.                                             END IF
  202.                                         END IF
  203.                                     NEXT
  204.                                 END IF
  205.                             END IF
  206.                         NEXT
  207.                         IF sf2 < 100 THEN EXIT FOR
  208.                     END IF
  209.                 NEXT
  210.                 IF sf2 < 100 THEN
  211.                     SendFleet sf1, sf2, sf3
  212.                     star(sf2).d = 400
  213.                     EXIT FOR
  214.                 END IF
  215.             END IF
  216.  
  217.             IF p = 2 THEN
  218.                 FOR i = 0 TO 99
  219.                     IF i <> home(id) AND star(i).o = id THEN
  220.                         IF star(i).t > 49 THEN
  221.                             ok = 1
  222.                             FOR j = 0 TO 99
  223.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  224.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  225.                                     IF dist <= 400 * ratio THEN
  226.                                         ok = 0
  227.                                         EXIT FOR
  228.                                     END IF
  229.                                 END IF
  230.                             NEXT
  231.                             IF ok = 1 THEN
  232.                                 SendFleet i, home(id), star(i).t
  233.                                 EXIT FOR
  234.                             END IF
  235.                         END IF
  236.                     END IF
  237.                 NEXT
  238.                 IF ok = 1 THEN EXIT FOR
  239.             END IF
  240.  
  241.             IF p = 3 THEN
  242.                 ok = 0
  243.                 FOR i = 0 TO 99
  244.                     IF i <> home(id) AND star(i).o = id THEN
  245.                         IF star(i).t > LL * 1.5 + star(i).p * 50 THEN
  246.                             ok = 1
  247.                             EXIT FOR
  248.                         END IF
  249.                     END IF
  250.                 NEXT
  251.                 IF ok = 1 THEN
  252.                     SendFleet i, home(id), star(i).t / 4
  253.                     EXIT FOR
  254.                 END IF
  255.             END IF
  256.  
  257.         NEXT
  258.  
  259.     END IF
  260.  
  261. SUB GamePanel
  262.     x1 = sw / 4
  263.     y1 = sh / 4
  264.     _DEST gp
  265.     COLOR 0, 8
  266.     CLS
  267.     _FONT ttf72
  268.     n$ = "Beyond The Stars"
  269.     l = _PRINTWIDTH(n$)
  270.     _PRINTSTRING ((960 - l) / 2, 12), n$, gp
  271.     LINE (80, 100)-(880, 100), 0
  272.     COLOR 0, 7
  273.     LINE (394, 180)-(566, 260), 7, BF
  274.     _PRINTSTRING (408, 184), "Save", gp
  275.     LINE (390, 360)-(570, 440), 7, BF
  276.     _PRINTSTRING (400, 364), "Load", gp
  277.     _FONT ttf36
  278.     COLOR 7, 8
  279.     n$ = "Right Click To Cancel"
  280.     l = _PRINTWIDTH(n$)
  281.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  282.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  283.     _DEST 0
  284.  
  285. SUB GetInput
  286.  
  287.     IF ch = CHR$(27) THEN repeat = 0
  288.     IF ch = "n" THEN NewGame
  289.     IF ch = "t" THEN tt = 1 - tt
  290.     IF ch = "p" THEN paused = 1 - paused
  291.     IF ch = "+" THEN
  292.         IF speed < 10 THEN speed = speed + 1
  293.     END IF
  294.     IF ch = "-" THEN
  295.         IF speed > 0 THEN speed = speed - 1
  296.     END IF
  297.     IF ch = "q" THEN QuickSave
  298.     IF ch = "l" THEN QuickRestore
  299.     IF ch = "g" THEN
  300.         gact = 1
  301.         paused = 1
  302.     END IF
  303.     ch = INKEY$
  304.  
  305.  
  306.     lclk = 0
  307.     rclk = 0
  308.  
  309.  
  310.         lmb = _MOUSEBUTTON(1)
  311.         rmb = _MOUSEBUTTON(2)
  312.  
  313.         x = _MOUSEX
  314.  
  315.         IF lmb AND lcx = sw THEN lcx = x
  316.         IF rmb AND rcx = sw THEN rcx = x
  317.  
  318.     WEND
  319.  
  320.     x = _MOUSEX
  321.     y = _MOUSEY
  322.  
  323.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  324.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  325.  
  326.     lcx = sw
  327.     rcx = sw
  328.  
  329.     IF rclk = 1 THEN
  330.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  331.             rclk = 0
  332.             oact = 0
  333.             pact = 0
  334.             gact = 0
  335.         ELSE
  336.             i = Identify
  337.             IF i = 100 THEN
  338.                 IF src = 100 THEN
  339.                     paused = 1 - paused
  340.                     ch = ""
  341.                 ELSE
  342.                     src = 100
  343.                 END IF
  344.                 rclk = 0
  345.             END IF
  346.         END IF
  347.     END IF
  348.  
  349.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 THEN
  350.         i = Identify
  351.         IF i = 100 THEN
  352.             gact = 1
  353.             lclk = 0
  354.         END IF
  355.     END IF
  356.  
  357.  
  358. FUNCTION Identify
  359.     ii = 100
  360.     FOR i = 0 TO 99
  361.         dx = star(i).x - x
  362.         dy = star(i).y - y
  363.         IF ABS(dx) <= star(i).s + 8 AND ABS(dy) <= star(i).s + 8 THEN
  364.             ii = i
  365.             EXIT FOR
  366.         END IF
  367.     NEXT
  368.     Identify = ii
  369.  
  370. SUB OrderPanel (i)
  371.     x1 = star(i).x - 420 * ratio
  372.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  373.     x2 = x1 + 400 * ratio
  374.     y1 = star(i).y
  375.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  376.     y2 = y1 + 225 * ratio
  377.     _DEST op
  378.     CLS 0, 8
  379.     COLOR 0, 8
  380.     _FONT ttf72
  381.     n$ = RTRIM$(star(i).n)
  382.     l = _PRINTWIDTH(n$)
  383.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  384.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  385.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  386.     COLOR 7, 8
  387.     _FONT ttf36
  388.     IF box = 0 THEN
  389.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  390.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  391.         LINE (xo, yo)-(xd, yd), 7, BF
  392.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  393.         LINE (xo, yo)-(xd, yd), 7, BF
  394.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  395.         LINE (xo, yo)-(xd, yd), 7, BF
  396.         n$ = RTRIM$(strng0)
  397.         COLOR 0, 7
  398.         _FONT ttf24
  399.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  400.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  401.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  402.     END IF
  403.     IF box = 1 THEN
  404.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  405.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  406.         LINE (xo, yo)-(xd, yd), 7, BF
  407.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  408.         LINE (xo, yo)-(xd, yd), 7, BF
  409.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  410.         LINE (xo, yo)-(xd, yd), 7, BF
  411.         n$ = RTRIM$(strng1)
  412.         COLOR 0, 7
  413.         _FONT ttf24
  414.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  415.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  416.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  417.     END IF
  418.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  419.     _DEST 0
  420.     oanx = x1: oany = y1
  421.  
  422. SUB PaintBackground
  423.     x = RND * sw
  424.     y = RND * sh
  425.     c = RND * 14 + 1
  426.     PSET (x, y), c
  427.     RANDOMIZE USING seed
  428.     FOR i = 1 TO 600 * ratio
  429.         x = RND * sw
  430.         y = RND * sh
  431.         c = RND * 14 + 1
  432.         PSET (x, y), c
  433.     NEXT
  434.  
  435. SUB PaintFleet
  436.     count = fltcnt
  437.     i = 0
  438.     WHILE count
  439.         IF fleet(i).o <> 0 THEN
  440.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  441.             count = count - 1
  442.         END IF
  443.         i = i + 1
  444.     WEND
  445.  
  446. SUB PaintStars
  447.  
  448.     'execute standing orders
  449.     FOR i = 0 TO 99
  450.         IF order(i).src <> 100 THEN
  451.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  452.                 order(i).src = 100
  453.             ELSE
  454.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 17
  455.                 IF star(i).t >= order(i).ovr THEN
  456.                     SendFleet order(i).src, order(i).dst, order(i).shp
  457.                 END IF
  458.             END IF
  459.         END IF
  460.     NEXT
  461.  
  462.     FOR i = 0 TO 99
  463.         c = star(i).c
  464.         x = star(i).x
  465.         y = star(i).y
  466.         o = star(i).o
  467.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  468.         COLOR 15
  469.         IF o > 0 THEN
  470.             PAINT (x, y), o + 8, c
  471.         END IF
  472.         _FONT ttf16
  473.         IF tt THEN
  474.             n$ = star(i).n
  475.             n$ = RTRIM$(n$)
  476.             l = _PRINTWIDTH(n$)
  477.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  478.         ELSE
  479.             n$ = STR$(star(i).t)
  480.             l = _PRINTWIDTH(n$)
  481.         END IF
  482.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  483.     NEXT
  484.  
  485.  
  486. SUB Player
  487.     'Add new order to standing orders
  488.     IF ord.src <> 100 THEN
  489.         i = ord.src
  490.         IF ord.shp = 0 THEN
  491.             order(i).src = 100
  492.         ELSE
  493.             order(i) = ord
  494.         END IF
  495.         src = 100
  496.         ord.src = 100
  497.     END IF
  498.  
  499.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  500.  
  501.         'If there is no source star see if we can get one
  502.         IF src = 100 THEN
  503.             i = Identify
  504.             IF i < 100 THEN WorldPanel i
  505.             IF lclk = 1 OR rclk = 1 THEN
  506.                 lclk = 0
  507.                 rclk = 0
  508.                 src = i
  509.             END IF
  510.         END IF
  511.  
  512.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  513.         IF src <> 100 THEN
  514.             c = 12
  515.             FOR i = 0 TO 99
  516.                 IF star(i).o = 1 THEN
  517.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  518.                     IF dist <= 251 * ratio THEN
  519.                         c = 10
  520.                         EXIT FOR
  521.                     END IF
  522.                 END IF
  523.             NEXT
  524.             i = Identify
  525.             IF i <> 100 THEN
  526.                 x = star(i).x
  527.                 y = star(i).y
  528.             END IF
  529.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  530.             LINE (star(src).x, star(src).y)-(x, y), c
  531.             n$ = STR$(INT(rang))
  532.             _FONT ttf16
  533.             _PRINTSTRING (x + 20, y), n$, 0
  534.         END IF
  535.  
  536.         'If we have a source star see if we clicked on a destination star
  537.         IF src <> 100 THEN
  538.             IF lclk = 1 OR rclk = 1 THEN
  539.                 i = Identify
  540.                 IF i = src THEN
  541.                     lclk = 0
  542.                     src = 100
  543.                     IF rclk = 1 THEN
  544.                         rclk = 0
  545.                         order(i).src = 100
  546.                     END IF
  547.                 ELSE
  548.                     IF i < 100 AND i <> src THEN
  549.                         IF lclk = 1 THEN
  550.                             lclk = 0
  551.                             FOR j = 0 TO 99
  552.                                 IF star(j).o = 1 THEN
  553.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  554.                                     IF dist <= 250 THEN
  555.                                         dst = i
  556.                                         pact = 1
  557.                                         EXIT FOR
  558.                                     END IF
  559.                                 END IF
  560.                             NEXT
  561.                         ELSE
  562.                             rclk = 0
  563.                             dst = i
  564.                             IF star(i).o = 1 THEN
  565.                                 oact = 1
  566.                             END IF
  567.                         END IF
  568.                     END IF
  569.                 END IF
  570.             END IF
  571.         END IF
  572.     END IF
  573.  
  574.     'If the game panel is active
  575.     IF gact = 1 THEN
  576.         GamePanel
  577.         IF lclk = 1 THEN
  578.             x1 = sw / 4 + 394: x2 = x1 + 172: y1 = sh / 4 + 180: y2 = y1 + 80
  579.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN SaveGame: gact = 0
  580.             x1 = sw / 4 + 390: x2 = x1 + 180: y1 = sh / 4 + 360: y2 = y1 + 80
  581.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN LoadGame: gact = 0
  582.         END IF
  583.     END IF
  584.  
  585.     'If the star standing orders panel is active
  586.     IF oact = 1 THEN
  587.  
  588.         IF star(src).o = 1 THEN
  589.             OrderPanel dst
  590.         END IF
  591.  
  592.         IF rclk = 1 THEN oact = 0
  593.  
  594.         IF box = 0 THEN
  595.             tmp$ = RTRIM$(strng0)
  596.         ELSE
  597.             tmp$ = RTRIM$(strng1)
  598.         END IF
  599.  
  600.         IF lclk = 1 THEN
  601.  
  602.             x1 = oanx: x2 = oanx + 400 * ratio
  603.             y1 = oany: y2 = oany + 540 * ratio
  604.  
  605.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  606.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  607.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  608.                     IF box = 0 THEN
  609.                         n$ = RTRIM$(strng0)
  610.                         l = LEN(n$)
  611.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  612.                     ELSE
  613.                         n$ = RTRIM$(strng1)
  614.                         l = LEN(n$)
  615.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  616.                     END IF
  617.                 END IF
  618.             END IF
  619.  
  620.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  621.  
  622.                 IF box = 0 THEN
  623.  
  624.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  625.                         ord.ovr = INT(VAL(strng0))
  626.                         box = 1
  627.                     END IF
  628.  
  629.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  630.                         strng0 = ""
  631.                     END IF
  632.  
  633.                 ELSE
  634.  
  635.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  636.                         IF INT(VAL(strng1)) > ord.ovr THEN
  637.                             strng1 = ""
  638.                         ELSE
  639.                             box = 0
  640.                             oact = 0
  641.                             ord.src = src
  642.                             ord.dst = dst
  643.                             ord.shp = VAL(strng1)
  644.                             strng0 = ""
  645.                             strng1 = ""
  646.                         END IF
  647.                     END IF
  648.  
  649.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  650.                         strng0 = ""
  651.                         strng1 = ""
  652.                         box = 0
  653.                     END IF
  654.  
  655.                 END IF
  656.  
  657.             END IF
  658.         END IF
  659.         x1 = 10000: y1 = 10000
  660.  
  661.     END IF
  662.  
  663.  
  664.     'If the fleet send panel is active
  665.     IF pact = 1 THEN
  666.         IF rclk = 1 THEN pact = 0
  667.         IF star(src).o = 1 THEN
  668.             ShowPanel dst
  669.         END IF
  670.         IF lclk = 1 THEN
  671.             tmp$ = RTRIM$(strng)
  672.  
  673.             x1 = panx: x2 = panx + 400 * ratio
  674.             y1 = pany: y2 = pany + 540 * ratio
  675.  
  676.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  677.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  678.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  679.                     strng = tmp$ + STR$(dig)
  680.                 END IF
  681.             END IF
  682.  
  683.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  684.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  685.                     pact = 0
  686.                     value = star(src).t
  687.                     SendFleet src, dst, value
  688.                     src = 100
  689.                 END IF
  690.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  691.                     pact = 0
  692.                     value = star(src).t / 2
  693.                     SendFleet src, dst, value
  694.                     src = 100
  695.                 END IF
  696.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  697.                     pact = 0
  698.                     value = star(src).t / 3
  699.                     SendFleet src, dst, value
  700.                     src = 100
  701.                 END IF
  702.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  703.                     strng = ""
  704.                 END IF
  705.             END IF
  706.  
  707.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  708.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  709.                     value = VAL(strng)
  710.                     strng = ""
  711.                     pact = 0
  712.                     IF value <= star(src).t AND star(src).t <> o THEN
  713.                         SendFleet src, dst, value
  714.                     END IF
  715.                     src = 100
  716.                 END IF
  717.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  718.                     pact = 0
  719.                     src = 100
  720.                     strng = ""
  721.                 END IF
  722.             END IF
  723.         END IF
  724.     END IF
  725.  
  726. SUB QuickSave
  727.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  728.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  729.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  730.     qfltcnt = fltcnt
  731.     qLL = LL
  732.  
  733. SUB QuickRestore
  734.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  735.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  736.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  737.     fltcnt = qfltcnt
  738.     LL = qLL
  739.     paused = 1
  740.  
  741. SUB LoadGame
  742.     OPEN "savegame.sav" FOR BINARY AS #2
  743.     GET #2, , star()
  744.     GET #2, , order()
  745.     GET #2, , fleet()
  746.     GET #2, , home()
  747.     GET #2, , fltcnt
  748.     GET #2, , LL
  749.     CLOSE #2
  750.     PRINT "Game Loaded"
  751.  
  752. SUB SaveGame
  753.     OPEN "savegame.sav" FOR BINARY AS #1
  754.     CLOSE #1
  755.     KILL "savegame.sav"
  756.     OPEN "savegame.sav" FOR BINARY AS #1
  757.     PUT #1, , star()
  758.     PUT #1, , order()
  759.     PUT #1, , fleet()
  760.     PUT #1, , home()
  761.     PUT #1, , fltcnt
  762.     PUT #1, , LL
  763.     CLOSE #1
  764.     PRINT "Game Saved"
  765.  
  766. SUB SendFleet (src, dst, ships)
  767.     IF fltcnt < 2000 THEN
  768.         FOR i = 0 TO 1999
  769.             IF fleet(i).o = 0 THEN
  770.                 fleet(i).o = star(src).o
  771.                 fleet(i).d = dst
  772.                 fleet(i).x1 = star(src).x
  773.                 fleet(i).y1 = star(src).y
  774.                 fleet(i).x2 = star(dst).x
  775.                 fleet(i).y2 = star(dst).y
  776.                 fleet(i).t = ships
  777.                 star(src).t = star(src).t - ships
  778.                 fltcnt = fltcnt + 1
  779.                 EXIT FOR
  780.             END IF
  781.         NEXT
  782.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  783.     END IF
  784.  
  785. SUB ShowPanel (i)
  786.     x1 = star(i).x - 420 * ratio
  787.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  788.     x2 = x1 + 400 * ratio
  789.     y1 = star(i).y
  790.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  791.     y2 = y1 + 540 * ratio
  792.     _DEST sp
  793.     CLS 0, 8
  794.     COLOR 0, 8
  795.     _FONT ttf72
  796.     n$ = RTRIM$(star(src).n)
  797.     l = _PRINTWIDTH(n$)
  798.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  799.     n$ = "to"
  800.     l = _PRINTWIDTH(n$)
  801.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  802.     n$ = RTRIM$(star(dst).n)
  803.     l = _PRINTWIDTH(n$)
  804.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  805.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  806.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  807.     n$ = RTRIM$(strng)
  808.     l = _PRINTWIDTH(n$)
  809.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  810.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  811.     LINE (xo, yo)-(xd, yd), 7, BF
  812.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  813.     LINE (xo, yo)-(xd, yd), 7, BF
  814.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  815.     LINE (xo, yo)-(xd, yd), 7, BF
  816.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  817.     LINE (xo, yo)-(xd, yd), 7, BF
  818.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  819.     LINE (xo, yo)-(xd, yd), 7, BF
  820.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  821.     LINE (xo, yo)-(xd, yd), 7, BF
  822.     _FONT ttf24
  823.     COLOR 7, 8
  824.     n$ = RTRIM$(STR$(star(src).t))
  825.     l = _PRINTWIDTH(n$)
  826.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  827.     n$ = RTRIM$(STR$(star(dst).t))
  828.     l = _PRINTWIDTH(n$)
  829.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  830.     _FONT ttf16
  831.     COLOR 0, 7
  832.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  833.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  834.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  835.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  836.     _FONT ttf72
  837.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  838.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  839.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  840.     panx = x1: pany = y1
  841.     _DEST 0
  842.  
  843. SUB Update
  844.     IF paused = 0 THEN
  845.         RANDOMIZE TIMER
  846.         FOR i = 0 TO 99
  847.             r = INT(RND * 60)
  848.             IF r < star(i).p THEN
  849.                 IF star(i).o > 0 THEN
  850.                     star(i).t = star(i).t + 1
  851.                 ELSE
  852.                     IF INT(RND * 10) < 3 THEN
  853.                         star(i).t = star(i).t + 1
  854.                     END IF
  855.                 END IF
  856.             END IF
  857.         NEXT
  858.  
  859.         count = fltcnt
  860.         i = 0
  861.         WHILE count
  862.             IF fleet(i).o <> 0 THEN
  863.                 count = count - 1
  864.                 IF fleet(i).x2 > fleet(i).x1 THEN
  865.                     fleet(i).x1 = fleet(i).x1 + 1
  866.                 END IF
  867.                 IF fleet(i).x2 < fleet(i).x1 THEN
  868.                     fleet(i).x1 = fleet(i).x1 - 1
  869.                 END IF
  870.                 IF fleet(i).y2 > fleet(i).y1 THEN
  871.                     fleet(i).y1 = fleet(i).y1 + 1
  872.                 END IF
  873.                 IF fleet(i).y2 < fleet(i).y1 THEN
  874.                     fleet(i).y1 = fleet(i).y1 - 1
  875.                 END IF
  876.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  877.                     dest = fleet(i).d
  878.                     IF star(dest).o = fleet(i).o THEN
  879.                         star(dest).t = star(dest).t + fleet(i).t
  880.                         fleet(i).o = 0
  881.                         fltcnt = fltcnt - 1
  882.                     ELSE
  883.                         o = star(dest).o
  884.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  885.                             k = 100
  886.                             shortest = 10000
  887.                             FOR j = 0 TO 99
  888.                                 IF star(j).o = o THEN
  889.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  890.                                     IF dist < shortest THEN
  891.                                         shortest = dist
  892.                                         k = j
  893.                                     END IF
  894.                                 END IF
  895.                             NEXT
  896.                             SendFleet dest, k, star(dest).t * 0.90
  897.                             star(dest).t = 0
  898.                             star(dest).o = fleet(i).o
  899.                             star(dest).t = fleet(i).t
  900.                             star(dest).o = fleet(i).o
  901.                             fleet(i).o = 0
  902.                             fltcnt = fltcnt - 1
  903.                         ELSE
  904.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  905.                                 alive = 1
  906.                                 WHILE alive
  907.                                     alive = 0
  908.                                     damorg = fleet(i).t / 10 + 1
  909.                                     damdst = star(dest).t / 8 + 1
  910.                                     fleet(i).t = fleet(i).t - damdst
  911.                                     star(dest).t = star(dest).t - damorg
  912.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  913.                                         alive = 1
  914.                                     END IF
  915.                                 WEND
  916.                                 IF star(dest).t < 1 THEN
  917.                                     star(dest).t = fleet(i).t
  918.                                     star(dest).o = fleet(i).o
  919.                                 END IF
  920.                                 fleet(i).o = 0
  921.                                 fltcnt = fltcnt - 1
  922.                             ELSE
  923.                                 k = 100
  924.                                 shortest = 10000
  925.                                 FOR j = 0 TO 99
  926.                                     IF star(j).o = fleet(i).o THEN
  927.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  928.                                         IF dist < shortest THEN
  929.                                             shortest = dist
  930.                                             k = j
  931.                                         END IF
  932.                                     END IF
  933.                                 NEXT
  934.                                 IF k < 100 THEN
  935.                                     fleet(i).x2 = star(k).x
  936.                                     fleet(i).y2 = star(k).y
  937.                                     fleet(i).d = k
  938.                                 ELSE
  939.                                     fleet(i).o = 0
  940.                                     fltcnt = fltcnt - 1
  941.                                 END IF
  942.                             END IF
  943.                         END IF
  944.                     END IF
  945.                 END IF
  946.             END IF
  947.             i = i + 1
  948.         WEND
  949.     END IF
  950.  
  951. SUB WorldPanel (i)
  952.     x1 = star(i).x - 420 * ratio
  953.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  954.     x2 = x1 + 400 * ratio
  955.     y1 = star(i).y
  956.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  957.     y2 = y1 + 225 * ratio
  958.     _DEST wp
  959.     CLS 0, 8
  960.     COLOR 0, 8
  961.     _FONT ttf72
  962.     n$ = RTRIM$(star(i).n)
  963.     l = _PRINTWIDTH(n$)
  964.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  965.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  966.     COLOR 7, 8
  967.     _FONT ttf36
  968.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  969.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  970.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  971.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  972.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  973.     n$ = "NO"
  974.     FOR j = 0 TO 99
  975.         IF star(i).o <> star(j).o THEN
  976.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  977.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  978.                 IF dist <= 250 THEN
  979.                     n$ = "YES"
  980.                     EXIT FOR
  981.                 END IF
  982.             END IF
  983.         END IF
  984.     NEXT
  985.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  986.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  987.     _DEST 0
  988.  
  989. SUB NewGame
  990.     DIM k AS INTEGER
  991.     DIM r AS INTEGER
  992.     DIM dx AS INTEGER
  993.     DIM dy AS INTEGER
  994.     DIM n AS STRING * 10
  995.     paused = 1
  996.     FOR i = 0 TO 999
  997.         fleet(i).o = 0
  998.     NEXT
  999.     slct = 0
  1000.     fltcnt = 0
  1001.     LL = 0
  1002.     seed = RND * 1000
  1003.     FOR i = 0 TO 99
  1004.         k = 1
  1005.         WHILE k
  1006.             k = 0
  1007.             x = RND * (sw - sww) + swn
  1008.             y = RND * (sh - shw) + shn
  1009.             r = INT(RND * 200)
  1010.             n = names(r)
  1011.             FOR j = 0 TO i - 1
  1012.                 dx = x - star(j).x
  1013.                 dy = y - star(j).y
  1014.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1015.                     k = 1
  1016.                 END IF
  1017.                 IF n = star(j).n THEN
  1018.                     k = 1
  1019.                 END IF
  1020.             NEXT
  1021.         WEND
  1022.         star(i).n = n
  1023.         star(i).x = x
  1024.         star(i).y = y
  1025.         star(i).c = RND * 6 + 9
  1026.         star(i).s = RND * 5
  1027.         star(i).o = 0
  1028.         star(i).p = star(i).s + (RND * 5) + 3
  1029.         star(i).t = 0
  1030.         order(i).src = 100
  1031.     NEXT
  1032.     FOR i = 1 TO 6
  1033.         ok = 0
  1034.         WHILE (ok < 1)
  1035.             ok = 1
  1036.             j = RND * 100
  1037.             FOR k = 1 TO i - 1
  1038.                 dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1039.                 IF dist < 500 * ratio THEN
  1040.                     ok = 0
  1041.                     EXIT FOR
  1042.                 END IF
  1043.             NEXT
  1044.             IF ok = 1 THEN
  1045.                 ok = -1
  1046.                 FOR k = 0 TO 99
  1047.                     dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1048.                     IF dist <= 200 THEN ok = ok + 1
  1049.                     IF ok = 2 THEN EXIT FOR
  1050.                 NEXT
  1051.             END IF
  1052.         WEND
  1053.         home(i) = j
  1054.         star(j).o = i
  1055.         star(j).p = 10
  1056.         star(j).t = 100
  1057.         star(j).s = 4
  1058.     NEXT
  1059.     star(home(1)).n = "Sol"
  1060.     star(home(1)).c = 14
  1061.     QuickSave
  1062.  
  1063. ' A lot of star names I made up
  1064.  
  1065. SUB StarNames
  1066.     names(0) = "Acamar"
  1067.     names(1) = "Arcab"
  1068.     names(2) = "Acrux"
  1069.     names(3) = "Adhara"
  1070.     names(4) = "Arneb"
  1071.     names(5) = "Antares"
  1072.     names(6) = "Arcturus"
  1073.     names(7) = "Atria"
  1074.     names(8) = "Beid"
  1075.     names(9) = "Betelgeuse"
  1076.     names(10) = "Botein"
  1077.     names(11) = "Beemim"
  1078.     names(12) = "Bellatrix"
  1079.     names(13) = "Bharani"
  1080.     names(14) = "Biham"
  1081.     names(15) = "Brachium"
  1082.     names(16) = "Canopus"
  1083.     names(17) = "Capella"
  1084.     names(18) = "Castor"
  1085.     names(19) = "Chara"
  1086.     names(20) = "Cursa"
  1087.     names(21) = "Copernicus"
  1088.     names(22) = "Chalawan"
  1089.     names(23) = "Chertan"
  1090.     names(24) = "Dabih"
  1091.     names(25) = "Dalim"
  1092.     names(26) = "Deneb"
  1093.     names(27) = "Denebola"
  1094.     names(28) = "Diadem"
  1095.     names(29) = "Diphda"
  1096.     names(30) = "Dschubba"
  1097.     names(31) = "Dziban"
  1098.     names(32) = "Edasich"
  1099.     names(33) = "Electra"
  1100.     names(34) = "Elgafar"
  1101.     names(35) = "Elkurud"
  1102.     names(36) = "Elnath"
  1103.     names(37) = "Eltanin"
  1104.     names(38) = "Enif"
  1105.     names(39) = "Errai"
  1106.     names(40) = "Fafnir"
  1107.     names(41) = "Fang"
  1108.     names(42) = "Fawaris"
  1109.     names(43) = "Felis"
  1110.     names(44) = "Fomalhaut"
  1111.     names(45) = "Fulu"
  1112.     names(46) = "Fumal"
  1113.     names(47) = "Furud"
  1114.     names(48) = "Garnet"
  1115.     names(49) = "Giausar"
  1116.     names(50) = "Gienah"
  1117.     names(51) = "Ginan"
  1118.     names(52) = "Gomeisa"
  1119.     names(53) = "Graffias"
  1120.     names(54) = "Grumium"
  1121.     names(55) = "Gudja"
  1122.     names(56) = "Hadar"
  1123.     names(57) = "Haedus"
  1124.     names(58) = "Hamal"
  1125.     names(59) = "Hassaleh"
  1126.     names(60) = "Hatysa"
  1127.     names(61) = "Helvetios"
  1128.     names(62) = "Heze"
  1129.     names(63) = "Homan"
  1130.     names(64) = "Iklil"
  1131.     names(65) = "Imai"
  1132.     names(66) = "Intercrus"
  1133.     names(67) = "Izar"
  1134.     names(68) = "Iccar"
  1135.     names(69) = "Inar"
  1136.     names(70) = "Iaeth"
  1137.     names(71) = "Imaous"
  1138.     names(72) = "Jabbah"
  1139.     names(73) = "Jishui"
  1140.     names(74) = "Jax"
  1141.     names(75) = "Jalae"
  1142.     names(76) = "Jewel"
  1143.     names(77) = "Jumbo"
  1144.     names(78) = "Jerue"
  1145.     names(79) = "Jabear"
  1146.     names(80) = "Kakkab"
  1147.     names(81) = "Kang"
  1148.     names(82) = "Kekouan"
  1149.     names(83) = "Keid"
  1150.     names(84) = "Kitalpha"
  1151.     names(85) = "Kochab"
  1152.     names(86) = "Kolob"
  1153.     names(87) = "Kobol"
  1154.     names(88) = "Larawag"
  1155.     names(89) = "Lesath"
  1156.     names(90) = "Libertas"
  1157.     names(91) = "Lich"
  1158.     names(92) = "Lilly"
  1159.     names(93) = "Laddel"
  1160.     names(94) = "Luminous"
  1161.     names(95) = "Lasacious"
  1162.     names(96) = "Mizar"
  1163.     names(97) = "Markab"
  1164.     names(98) = "Matar"
  1165.     names(99) = "Mintaka"
  1166.     names(100) = "Meleph"
  1167.     names(101) = "Menkar"
  1168.     names(102) = "Merga"
  1169.     names(103) = "Merope"
  1170.     names(104) = "Nahn"
  1171.     names(105) = "Naos"
  1172.     names(106) = "Nashira"
  1173.     names(107) = "Navi"
  1174.     names(108) = "Nekkar"
  1175.     names(109) = "Nembus"
  1176.     names(110) = "Nihal"
  1177.     names(111) = "Nunki"
  1178.     names(112) = "Ogma"
  1179.     names(113) = "Okab"
  1180.     names(114) = "Ohmy"
  1181.     names(115) = "Oragami"
  1182.     names(116) = "Origen"
  1183.     names(117) = "Omanii"
  1184.     names(118) = "Obytewa"
  1185.     names(119) = "Oglok"
  1186.     names(120) = "Phact"
  1187.     names(121) = "Pherkad"
  1188.     names(122) = "Pleione"
  1189.     names(122) = "Polaris"
  1190.     names(123) = "Pollux"
  1191.     names(124) = "Procyon"
  1192.     names(125) = "Proxima"
  1193.     names(126) = "Polis"
  1194.     names(127) = "Quaint"
  1195.     names(128) = "QB64"
  1196.     names(129) = "Quetzal"
  1197.     names(130) = "Qussol"
  1198.     names(131) = "Quella"
  1199.     names(132) = "Quyaeo"
  1200.     names(133) = "Ququdas"
  1201.     names(134) = "Quekak"
  1202.     names(135) = "Rasalas"
  1203.     names(136) = "Regor"
  1204.     names(137) = "Regulus"
  1205.     names(138) = "Rigel"
  1206.     names(139) = "Revati"
  1207.     names(140) = "Rotenev"
  1208.     names(141) = "Rukbat"
  1209.     names(142) = "Rastaban"
  1210.     names(143) = "Sabik"
  1211.     names(144) = "Sadr"
  1212.     names(145) = "Saiph"
  1213.     names(146) = "Sargas"
  1214.     names(147) = "Sarin"
  1215.     names(148) = "Syrma"
  1216.     names(149) = "Spica"
  1217.     names(150) = "Sirius"
  1218.     names(151) = "Tarazed"
  1219.     names(152) = "Taygeta"
  1220.     names(153) = "Tejat"
  1221.     names(154) = "Thabit"
  1222.     names(155) = "Thuban"
  1223.     names(156) = "Tiaki"
  1224.     names(157) = "Toliman"
  1225.     names(158) = "Torcular"
  1226.     names(157) = "Umala"
  1227.     names(158) = "Ulatte"
  1228.     names(159) = "Ubbessa"
  1229.     names(160) = "Unoless"
  1230.     names(161) = "Umaddem"
  1231.     names(162) = "Ummbra"
  1232.     names(162) = "Uniqu"
  1233.     names(163) = "Uzzaal"
  1234.     names(164) = "Vega"
  1235.     names(165) = "Veritate"
  1236.     names(166) = "Vindetrix"
  1237.     names(167) = "Vedas"
  1238.     names(168) = "Vergg"
  1239.     names(169) = "Vacant"
  1240.     names(170) = "Vucae"
  1241.     names(171) = "Vicar"
  1242.     names(172) = "Wasat"
  1243.     names(173) = "Wazn"
  1244.     names(174) = "Wezen"
  1245.     names(175) = "Waiten"
  1246.     names(176) = "Wachar"
  1247.     names(177) = "Wheelz"
  1248.     names(178) = "Whatsp"
  1249.     names(179) = "Wassand"
  1250.     names(180) = "Xenno"
  1251.     names(181) = "Xyphod"
  1252.     names(182) = "Xu"
  1253.     names(183) = "Xaal"
  1254.     names(184) = "Xyross"
  1255.     names(185) = "Xiggot"
  1256.     names(186) = "Xirrks"
  1257.     names(187) = "Yed"
  1258.     names(188) = "Yildun"
  1259.     names(189) = "Yundun"
  1260.     names(190) = "Yavyo"
  1261.     names(191) = "Yotrac"
  1262.     names(192) = "Yxzoqu"
  1263.     names(193) = "Ynnot"
  1264.     names(194) = "Zaniah"
  1265.     names(195) = "Zaurak"
  1266.     names(196) = "Zhang"
  1267.     names(197) = "Zibal"
  1268.     names(198) = "Zosma"
  1269.     names(199) = "Zuben"
  1270.  
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #6 on: January 19, 2020, 01:26:12 am »
Fixed a bug. Can't remember what it was. Made a better game panel. Has up to 10 (0-9) saved games. Also added custom star maps. The custom starmap can only be set up at the very start of the game. As soon as the game comes up activate the game panel by left clicking the starmap. Then click on custom mode. The custom mode box will change color. Right click to close the game panel. Move the stars around! Save your custom starmap! :) Oh yeah, click "Custom Mode" again to continue game.
Code: QB64: [Select]
  1.  TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57. sw = _DESKTOPWIDTH '                   native video with of syatem
  58. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  59. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  60. nw = 1920
  61.  
  62. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  63.  
  64. shw = sh / 20
  65. shn = sh / 40
  66. nh = 1080
  67.  
  68. tt = 0
  69. lcx = sw
  70. rcx = sw
  71. cp = 100
  72. h = 100
  73. ar = 0
  74. rng = 200
  75. slct = 0
  76. strng = ""
  77. strng0 = ""
  78. strng1 = ""
  79. src = 100
  80. dst = 100
  81. ord.src = 100
  82.  
  83. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  84.  
  85.  
  86. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  87. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  88. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  89. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  90.  
  91. StarNames
  92.  
  93. NewGame
  94.  
  95. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  96. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  97. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  98. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  99.  
  100. repeat = 1
  101.  
  102. WHILE repeat
  103.  
  104.     CLS
  105.  
  106.     PaintBackground
  107.  
  108.     PaintStars
  109.  
  110.     PaintFleet
  111.  
  112.     FOR it = 0 TO speed
  113.  
  114.         Update
  115.  
  116.         GetInput
  117.  
  118.         Player
  119.  
  120.         Computer
  121.  
  122.     NEXT
  123.  
  124.     _DISPLAY
  125.  
  126.  
  127.  
  128. SUB Computer
  129.  
  130.     IF paused = 0 THEN
  131.         id = INT(RND * 5) + 2
  132.         i = home(id)
  133.         IF star(i).o <> id THEN
  134.             FOR j = 0 TO 99
  135.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  136.             NEXT
  137.         END IF
  138.  
  139.         FOR p = 0 TO 3
  140.  
  141.             IF p = 0 THEN
  142.                 IF star(i).t > LL THEN
  143.                     away = 10000
  144.                     FOR j = 0 TO 99
  145.                         IF star(j).o <> id THEN
  146.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  147.                             IF dist < away THEN
  148.                                 away = dist
  149.                                 o = star(j).o
  150.                             END IF
  151.                         END IF
  152.                     NEXT
  153.                     away1 = 10000
  154.                     away2 = 10000
  155.                     jay1 = 100
  156.                     jay2 = 100
  157.                     FOR j = 0 TO 99
  158.                         IF star(j).o = o THEN
  159.                             IF star(j).d > 0 THEN
  160.                                 star(j).d = star(j).d - 1
  161.                             ELSE
  162.                                 ok = 1
  163.                                 FOR k = 0 TO 99
  164.                                     IF star(k).o = id THEN
  165.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  166.                                         IF dist <= 250 THEN
  167.                                             ok = 1
  168.                                             EXIT FOR
  169.                                         END IF
  170.                                     END IF
  171.                                 NEXT
  172.                             END IF
  173.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  174.                             IF dist < away1 THEN
  175.                                 IF away1 < away2 THEN
  176.                                     away2 = away1
  177.                                     jay2 = jay1
  178.                                 END IF
  179.                                 away1 = dist
  180.                                 jay1 = j
  181.                             ELSE
  182.                                 IF dist < away2 THEN
  183.                                     away2 = dist
  184.                                     jay2 = j
  185.                                 END IF
  186.                             END IF
  187.                         END IF
  188.                     NEXT
  189.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  190.                         SendFleet i, jay1, star(i).t / 1.5
  191.                         star(jay1).d = 400
  192.                     ELSE
  193.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  194.                             SendFleet i, jay2, star(i).t / 1.5
  195.                             star(jay2).d = 400
  196.                         END IF
  197.                     END IF
  198.                 END IF
  199.             END IF
  200.  
  201.             IF p = 1 THEN
  202.                 sf2 = 100
  203.                 FOR i = 0 TO 99
  204.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  205.                         sf3 = star(i).t / 2.5
  206.                         FOR j = 0 TO 99
  207.                             IF star(j).d > 0 THEN
  208.                                 star(j).d = star(j).d - 1
  209.                             ELSE
  210.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  211.                                     FOR k = 0 TO 99
  212.                                         IF star(k).o = id THEN
  213.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  214.                                             IF dist <= 250 * ratio THEN
  215.                                                 sf1 = i
  216.                                                 sf2 = j
  217.                                                 EXIT FOR
  218.                                             END IF
  219.                                         END IF
  220.                                     NEXT
  221.                                 END IF
  222.                             END IF
  223.                         NEXT
  224.                         IF sf2 < 100 THEN EXIT FOR
  225.                     END IF
  226.                 NEXT
  227.                 IF sf2 < 100 THEN
  228.                     SendFleet sf1, sf2, sf3
  229.                     star(sf2).d = 400
  230.                     EXIT FOR
  231.                 END IF
  232.             END IF
  233.  
  234.             IF p = 2 THEN
  235.                 FOR i = 0 TO 99
  236.                     IF i <> home(id) AND star(i).o = id THEN
  237.                         IF star(i).t > 49 THEN
  238.                             ok = 1
  239.                             FOR j = 0 TO 99
  240.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  241.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  242.                                     IF dist <= 400 * ratio THEN
  243.                                         ok = 0
  244.                                         EXIT FOR
  245.                                     END IF
  246.                                 END IF
  247.                             NEXT
  248.                             IF ok = 1 THEN
  249.                                 SendFleet i, home(id), star(i).t
  250.                                 EXIT FOR
  251.                             END IF
  252.                         END IF
  253.                     END IF
  254.                 NEXT
  255.                 IF ok = 1 THEN EXIT FOR
  256.             END IF
  257.  
  258.             IF p = 3 THEN
  259.                 ok = 0
  260.                 FOR i = 0 TO 99
  261.                     IF i <> home(id) AND star(i).o = id THEN
  262.                         IF star(i).t > LL * 1.5 + star(i).p * 50 THEN
  263.                             ok = 1
  264.                             EXIT FOR
  265.                         END IF
  266.                     END IF
  267.                 NEXT
  268.                 IF ok = 1 THEN
  269.                     SendFleet i, home(id), star(i).t / 4
  270.                     EXIT FOR
  271.                 END IF
  272.             END IF
  273.  
  274.         NEXT
  275.  
  276.     END IF
  277.  
  278. SUB GamePanel
  279.     x1 = sw / 4
  280.     y1 = sh / 4
  281.     _DEST gp
  282.     COLOR 0, 8
  283.     CLS
  284.     _FONT ttf72
  285.     n$ = "Beyond The Stars"
  286.     l = _PRINTWIDTH(n$)
  287.     _PRINTSTRING ((960 - l) / 2, 12), n$
  288.     LINE (40, 100)-(920, 100), 0
  289.     COLOR 7, 8
  290.     _FONT ttf36
  291.     _PRINTSTRING (42, 120), "Save"
  292.     _PRINTSTRING (42, 180), "Load"
  293.     COLOR 0, 7
  294.     FOR i = 143 TO 874 STEP 81
  295.         LINE (i, 115)-(i + 39, 158), 7, BF
  296.         LINE (i, 175)-(i + 39, 218), 7, BF
  297.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  298.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  299.     NEXT
  300.     n$ = "Custom Mode"
  301.     c = 7
  302.     IF cm = 1 THEN c = 168
  303.     l = _PRINTWIDTH(n$)
  304.     LINE (40, 235)-(60 + l, 295), c, BF
  305.     COLOR 0, c
  306.     _PRINTSTRING (50, 250), n$
  307.     COLOR 7, 8
  308.     n$ = "Right Click To Cancel"
  309.     l = _PRINTWIDTH(n$)
  310.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  311.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  312.     _DEST 0
  313.  
  314. SUB GetInput
  315.  
  316.     IF ch = CHR$(27) THEN repeat = 0
  317.     IF ch = "n" THEN NewGame
  318.     IF ch = "t" THEN tt = 1 - tt
  319.     IF ch = "p" THEN paused = 1 - paused
  320.     IF ch = "+" THEN
  321.         IF speed < 10 THEN speed = speed + 1
  322.     END IF
  323.     IF ch = "-" THEN
  324.         IF speed > 0 THEN speed = speed - 1
  325.     END IF
  326.     IF ch = "q" THEN QuickSave
  327.     IF ch = "l" THEN QuickRestore
  328.     IF ch = "g" THEN
  329.         gact = 1
  330.         paused = 1
  331.     END IF
  332.     ch = INKEY$
  333.  
  334.  
  335.     lclk = 0
  336.     rclk = 0
  337.  
  338.  
  339.         lmb = _MOUSEBUTTON(1)
  340.         rmb = _MOUSEBUTTON(2)
  341.  
  342.         x = _MOUSEX
  343.  
  344.         IF lmb AND lcx = sw THEN lcx = x
  345.         IF rmb AND rcx = sw THEN rcx = x
  346.  
  347.     WEND
  348.  
  349.     x = _MOUSEX
  350.     y = _MOUSEY
  351.  
  352.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  353.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  354.  
  355.     lcx = sw
  356.     rcx = sw
  357.  
  358.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  359.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  360.             rclk = 0
  361.             oact = 0
  362.             pact = 0
  363.             gact = 0
  364.         ELSE
  365.             i = Identify
  366.             IF i = 100 THEN
  367.                 IF src = 100 THEN
  368.                     paused = 1 - paused
  369.                     ch = ""
  370.                 ELSE
  371.                     src = 100
  372.                 END IF
  373.                 rclk = 0
  374.             END IF
  375.         END IF
  376.     END IF
  377.  
  378.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 THEN
  379.         i = Identify
  380.         IF i = 100 THEN
  381.             gact = 1
  382.         END IF
  383.     END IF
  384.  
  385.  
  386. FUNCTION Identify
  387.     ii = 100
  388.     FOR i = 0 TO 99
  389.         dx = star(i).x - x
  390.         dy = star(i).y - y
  391.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  392.             ii = i
  393.             EXIT FOR
  394.         END IF
  395.     NEXT
  396.     Identify = ii
  397.  
  398. SUB OrderPanel (i)
  399.     x1 = star(i).x - 420 * ratio
  400.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  401.     x2 = x1 + 400 * ratio
  402.     y1 = star(i).y
  403.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  404.     y2 = y1 + 225 * ratio
  405.     _DEST op
  406.     CLS 0, 8
  407.     COLOR 0, 8
  408.     _FONT ttf72
  409.     n$ = RTRIM$(star(i).n)
  410.     l = _PRINTWIDTH(n$)
  411.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  412.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  413.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  414.     COLOR 7, 8
  415.     _FONT ttf36
  416.     IF box = 0 THEN
  417.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  418.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  419.         LINE (xo, yo)-(xd, yd), 7, BF
  420.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  421.         LINE (xo, yo)-(xd, yd), 7, BF
  422.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  423.         LINE (xo, yo)-(xd, yd), 7, BF
  424.         n$ = RTRIM$(strng0)
  425.         COLOR 0, 7
  426.         _FONT ttf24
  427.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  428.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  429.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  430.     END IF
  431.     IF box = 1 THEN
  432.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  433.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  434.         LINE (xo, yo)-(xd, yd), 7, BF
  435.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  436.         LINE (xo, yo)-(xd, yd), 7, BF
  437.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  438.         LINE (xo, yo)-(xd, yd), 7, BF
  439.         n$ = RTRIM$(strng1)
  440.         COLOR 0, 7
  441.         _FONT ttf24
  442.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  443.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  444.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  445.     END IF
  446.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  447.     _DEST 0
  448.     oanx = x1: oany = y1
  449.  
  450. SUB PaintBackground
  451.     x = RND * sw
  452.     y = RND * sh
  453.     c = RND * 14 + 1
  454.     PSET (x, y), c
  455.     RANDOMIZE USING seed
  456.     FOR i = 1 TO 600 * ratio
  457.         x = RND * sw
  458.         y = RND * sh
  459.         c = RND * 14 + 1
  460.         PSET (x, y), c
  461.     NEXT
  462.  
  463. SUB PaintFleet
  464.     count = fltcnt
  465.     i = 0
  466.     WHILE count
  467.         IF fleet(i).o <> 0 THEN
  468.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  469.             count = count - 1
  470.         END IF
  471.         i = i + 1
  472.     WEND
  473.  
  474. SUB PaintStars
  475.  
  476.     'execute standing orders
  477.     FOR i = 0 TO 99
  478.         IF order(i).src <> 100 THEN
  479.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  480.                 order(i).src = 100
  481.             ELSE
  482.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  483.                 IF star(i).t >= order(i).ovr THEN
  484.                     SendFleet order(i).src, order(i).dst, order(i).shp
  485.                 END IF
  486.             END IF
  487.         END IF
  488.     NEXT
  489.  
  490.     FOR i = 0 TO 99
  491.         c = star(i).c
  492.         x = star(i).x
  493.         y = star(i).y
  494.         o = star(i).o
  495.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  496.         COLOR 15
  497.         IF o > 0 THEN
  498.             PAINT (x, y), o + 8, c
  499.         END IF
  500.         _FONT ttf16
  501.         IF tt THEN
  502.             n$ = star(i).n
  503.             n$ = RTRIM$(n$)
  504.             l = _PRINTWIDTH(n$)
  505.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  506.         ELSE
  507.             n$ = STR$(star(i).t)
  508.             l = _PRINTWIDTH(n$)
  509.         END IF
  510.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  511.     NEXT
  512.  
  513.  
  514. SUB Player
  515.  
  516.     ' Custom Map Mode
  517.     IF cm = 1 THEN
  518.         IF lmb THEN
  519.             i = Identify
  520.             IF i < 100 THEN
  521.                 WHILE _MOUSEINPUT: WEND
  522.                 nx = _MOUSEX
  523.                 ny = _MOUSEY
  524.                 ok = 1
  525.                 FOR j = 0 TO 99
  526.                     IF j <> i THEN
  527.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  528.                         IF dist <= 60 THEN
  529.                             ok = 0
  530.                             EXIT FOR
  531.                         END IF
  532.                     END IF
  533.                 NEXT
  534.                 IF ok = 1 THEN
  535.                     star(i).x = nx
  536.                     star(i).y = ny
  537.                 ELSE
  538.                     _MOUSEMOVE star(i).x, star(i).y
  539.                 END IF
  540.             END IF
  541.         END IF
  542.     END IF
  543.  
  544.     'Add new order to standing orders
  545.     IF ord.src <> 100 THEN
  546.         i = ord.src
  547.         IF ord.shp = 0 THEN
  548.             order(i).src = 100
  549.         ELSE
  550.             order(i) = ord
  551.         END IF
  552.         src = 100
  553.         ord.src = 100
  554.     END IF
  555.  
  556.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  557.  
  558.         'If there is no source star see if we can get one
  559.         IF src = 100 AND cm = 0 THEN
  560.             i = Identify
  561.             IF i < 100 THEN WorldPanel i
  562.             IF lclk = 1 OR rclk = 1 THEN
  563.                 lclk = 0
  564.                 rclk = 0
  565.                 src = i
  566.             END IF
  567.         END IF
  568.  
  569.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  570.         IF src <> 100 THEN
  571.             c = 12
  572.             FOR i = 0 TO 99
  573.                 IF star(i).o = 1 THEN
  574.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  575.                     IF dist <= 251 * ratio THEN
  576.                         c = 10
  577.                         EXIT FOR
  578.                     END IF
  579.                 END IF
  580.             NEXT
  581.             i = Identify
  582.             IF i <> 100 THEN
  583.                 x = star(i).x
  584.                 y = star(i).y
  585.             END IF
  586.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  587.             LINE (star(src).x, star(src).y)-(x, y), c
  588.             n$ = STR$(INT(rang))
  589.             _FONT ttf16
  590.             _PRINTSTRING (x + 20, y), n$, 0
  591.         END IF
  592.  
  593.         'If we have a source star see if we clicked on a destination star
  594.         IF src <> 100 THEN
  595.             IF lclk = 1 OR rclk = 1 THEN
  596.                 i = Identify
  597.                 IF i = src THEN
  598.                     lclk = 0
  599.                     src = 100
  600.                     IF rclk = 1 THEN
  601.                         rclk = 0
  602.                         order(i).src = 100
  603.                     END IF
  604.                 ELSE
  605.                     IF i < 100 AND i <> src THEN
  606.                         IF lclk = 1 THEN
  607.                             lclk = 0
  608.                             FOR j = 0 TO 99
  609.                                 IF star(j).o = 1 THEN
  610.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  611.                                     IF dist <= 250 THEN
  612.                                         dst = i
  613.                                         pact = 1
  614.                                         EXIT FOR
  615.                                     END IF
  616.                                 END IF
  617.                             NEXT
  618.                         ELSE
  619.                             rclk = 0
  620.                             dst = i
  621.                             IF star(i).o = 1 THEN
  622.                                 oact = 1
  623.                             END IF
  624.                         END IF
  625.                     END IF
  626.                 END IF
  627.             END IF
  628.         END IF
  629.     END IF
  630.  
  631.     'If the game panel is active
  632.     IF gact = 1 THEN
  633.         GamePanel
  634.         IF lclk = 1 THEN
  635.             FOR i = 143 TO 874 STEP 81
  636.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  637.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  638.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  639.                     SaveGame n$
  640.                 END IF
  641.                 y1 = y1 + 60: y2 = y2 + 60
  642.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  643.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  644.                     LoadGame n$
  645.                 END IF
  646.             NEXT
  647.             IF fltcnt = 0 THEN
  648.                 _FONT ttf36
  649.                 x1 = 40 + sw / 4: x2 = x1 + 20 + _PRINTWIDTH("Custom Mode"): y1 = 235 + sh / 4: y2 = y1 + 60
  650.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  651.                     cm = 1 - cm
  652.                 END IF
  653.             END IF
  654.         END IF
  655.     END IF
  656.  
  657.     'If the star standing orders panel is active
  658.     IF oact = 1 THEN
  659.  
  660.         IF star(src).o = 1 THEN
  661.             OrderPanel dst
  662.         END IF
  663.  
  664.         IF rclk = 1 THEN oact = 0
  665.  
  666.         IF box = 0 THEN
  667.             tmp$ = RTRIM$(strng0)
  668.         ELSE
  669.             tmp$ = RTRIM$(strng1)
  670.         END IF
  671.  
  672.         IF lclk = 1 THEN
  673.  
  674.             x1 = oanx: x2 = oanx + 400 * ratio
  675.             y1 = oany: y2 = oany + 540 * ratio
  676.  
  677.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  678.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  679.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  680.                     IF box = 0 THEN
  681.                         n$ = RTRIM$(strng0)
  682.                         l = LEN(n$)
  683.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  684.                     ELSE
  685.                         n$ = RTRIM$(strng1)
  686.                         l = LEN(n$)
  687.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  688.                     END IF
  689.                 END IF
  690.             END IF
  691.  
  692.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  693.  
  694.                 IF box = 0 THEN
  695.  
  696.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  697.                         ord.ovr = INT(VAL(strng0))
  698.                         box = 1
  699.                     END IF
  700.  
  701.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  702.                         strng0 = ""
  703.                     END IF
  704.  
  705.                 ELSE
  706.  
  707.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  708.                         IF INT(VAL(strng1)) > ord.ovr THEN
  709.                             strng1 = ""
  710.                         ELSE
  711.                             box = 0
  712.                             oact = 0
  713.                             ord.src = src
  714.                             ord.dst = dst
  715.                             ord.shp = VAL(strng1)
  716.                             strng0 = ""
  717.                             strng1 = ""
  718.                         END IF
  719.                     END IF
  720.  
  721.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  722.                         strng0 = ""
  723.                         strng1 = ""
  724.                         box = 0
  725.                     END IF
  726.  
  727.                 END IF
  728.  
  729.             END IF
  730.         END IF
  731.         x1 = 10000: y1 = 10000
  732.  
  733.     END IF
  734.  
  735.  
  736.     'If the fleet send panel is active
  737.     IF pact = 1 THEN
  738.         IF rclk = 1 THEN pact = 0
  739.         IF star(src).o = 1 THEN
  740.             ShowPanel dst
  741.         END IF
  742.         IF lclk = 1 THEN
  743.             tmp$ = RTRIM$(strng)
  744.  
  745.             x1 = panx: x2 = panx + 400 * ratio
  746.             y1 = pany: y2 = pany + 540 * ratio
  747.  
  748.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  749.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  750.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  751.                     strng = tmp$ + STR$(dig)
  752.                 END IF
  753.             END IF
  754.  
  755.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  756.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  757.                     pact = 0
  758.                     value = star(src).t
  759.                     SendFleet src, dst, value
  760.                     src = 100
  761.                 END IF
  762.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  763.                     pact = 0
  764.                     value = star(src).t / 2
  765.                     SendFleet src, dst, value
  766.                     src = 100
  767.                 END IF
  768.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  769.                     pact = 0
  770.                     value = star(src).t / 3
  771.                     SendFleet src, dst, value
  772.                     src = 100
  773.                 END IF
  774.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  775.                     strng = ""
  776.                 END IF
  777.             END IF
  778.  
  779.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  780.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  781.                     value = VAL(strng)
  782.                     strng = ""
  783.                     pact = 0
  784.                     IF value <= star(src).t AND star(src).t <> o THEN
  785.                         SendFleet src, dst, value
  786.                     END IF
  787.                     src = 100
  788.                 END IF
  789.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  790.                     pact = 0
  791.                     src = 100
  792.                     strng = ""
  793.                 END IF
  794.             END IF
  795.         END IF
  796.     END IF
  797.  
  798. SUB QuickSave
  799.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  800.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  801.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  802.     qfltcnt = fltcnt
  803.     qLL = LL
  804.  
  805. SUB QuickRestore
  806.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  807.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  808.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  809.     fltcnt = qfltcnt
  810.     LL = qLL
  811.     paused = 1
  812.  
  813. SUB LoadGame (n$)
  814.     n$ = n$ + ".sav"
  815.     IF _FILEEXISTS(n$) THEN
  816.         OPEN n$ FOR BINARY AS #2
  817.         GET #2, , star()
  818.         GET #2, , order()
  819.         GET #2, , fleet()
  820.         GET #2, , home()
  821.         GET #2, , fltcnt
  822.         GET #2, , LL
  823.         CLOSE #2
  824.         PRINT "Game Loaded"
  825.     END IF
  826.  
  827. SUB SaveGame (n$)
  828.     n$ = n$ + ".sav"
  829.     OPEN n$ FOR BINARY AS #1
  830.     CLOSE #1
  831.     KILL n$
  832.     OPEN n$ FOR BINARY AS #1
  833.     PUT #1, , star()
  834.     PUT #1, , order()
  835.     PUT #1, , fleet()
  836.     PUT #1, , home()
  837.     PUT #1, , fltcnt
  838.     PUT #1, , LL
  839.     CLOSE #1
  840.     PRINT "Game Saved"
  841.  
  842. SUB SendFleet (src, dst, ships)
  843.     IF fltcnt < 2000 THEN
  844.         FOR i = 0 TO 1999
  845.             IF fleet(i).o = 0 THEN
  846.                 fleet(i).o = star(src).o
  847.                 fleet(i).d = dst
  848.                 fleet(i).x1 = star(src).x
  849.                 fleet(i).y1 = star(src).y
  850.                 fleet(i).x2 = star(dst).x
  851.                 fleet(i).y2 = star(dst).y
  852.                 fleet(i).t = ships
  853.                 star(src).t = star(src).t - ships
  854.                 fltcnt = fltcnt + 1
  855.                 EXIT FOR
  856.             END IF
  857.         NEXT
  858.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  859.     END IF
  860.  
  861. SUB ShowPanel (i)
  862.     x1 = star(i).x - 420 * ratio
  863.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  864.     x2 = x1 + 400 * ratio
  865.     y1 = star(i).y
  866.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  867.     y2 = y1 + 540 * ratio
  868.     _DEST sp
  869.     CLS 0, 8
  870.     COLOR 0, 8
  871.     _FONT ttf72
  872.     n$ = RTRIM$(star(src).n)
  873.     l = _PRINTWIDTH(n$)
  874.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  875.     n$ = "to"
  876.     l = _PRINTWIDTH(n$)
  877.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  878.     n$ = RTRIM$(star(dst).n)
  879.     l = _PRINTWIDTH(n$)
  880.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  881.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  882.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  883.     n$ = RTRIM$(strng)
  884.     l = _PRINTWIDTH(n$)
  885.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  886.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  887.     LINE (xo, yo)-(xd, yd), 7, BF
  888.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  889.     LINE (xo, yo)-(xd, yd), 7, BF
  890.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  891.     LINE (xo, yo)-(xd, yd), 7, BF
  892.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  893.     LINE (xo, yo)-(xd, yd), 7, BF
  894.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  895.     LINE (xo, yo)-(xd, yd), 7, BF
  896.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  897.     LINE (xo, yo)-(xd, yd), 7, BF
  898.     _FONT ttf24
  899.     COLOR 7, 8
  900.     n$ = RTRIM$(STR$(star(src).t))
  901.     l = _PRINTWIDTH(n$)
  902.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  903.     n$ = RTRIM$(STR$(star(dst).t))
  904.     l = _PRINTWIDTH(n$)
  905.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  906.     _FONT ttf16
  907.     COLOR 0, 7
  908.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  909.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  910.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  911.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  912.     _FONT ttf72
  913.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  914.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  915.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  916.     panx = x1: pany = y1
  917.     _DEST 0
  918.  
  919. SUB Update
  920.     IF paused = 0 THEN
  921.         RANDOMIZE TIMER
  922.         FOR i = 0 TO 99
  923.             r = INT(RND * 60)
  924.             IF r < star(i).p THEN
  925.                 IF star(i).o > 0 THEN
  926.                     star(i).t = star(i).t + 1
  927.                 ELSE
  928.                     IF INT(RND * 10) < 3 THEN
  929.                         star(i).t = star(i).t + 1
  930.                     END IF
  931.                 END IF
  932.             END IF
  933.         NEXT
  934.  
  935.         count = fltcnt
  936.         i = 0
  937.         WHILE count
  938.             IF fleet(i).o <> 0 THEN
  939.                 count = count - 1
  940.                 IF fleet(i).x2 > fleet(i).x1 THEN
  941.                     fleet(i).x1 = fleet(i).x1 + 1
  942.                 END IF
  943.                 IF fleet(i).x2 < fleet(i).x1 THEN
  944.                     fleet(i).x1 = fleet(i).x1 - 1
  945.                 END IF
  946.                 IF fleet(i).y2 > fleet(i).y1 THEN
  947.                     fleet(i).y1 = fleet(i).y1 + 1
  948.                 END IF
  949.                 IF fleet(i).y2 < fleet(i).y1 THEN
  950.                     fleet(i).y1 = fleet(i).y1 - 1
  951.                 END IF
  952.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  953.                     dest = fleet(i).d
  954.                     IF star(dest).o = fleet(i).o THEN
  955.                         star(dest).t = star(dest).t + fleet(i).t
  956.                         fleet(i).o = 0
  957.                         fltcnt = fltcnt - 1
  958.                     ELSE
  959.                         o = star(dest).o
  960.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  961.                             k = 100
  962.                             shortest = 10000
  963.                             FOR j = 0 TO 99
  964.                                 IF star(j).o = o THEN
  965.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  966.                                     IF dist < shortest THEN
  967.                                         shortest = dist
  968.                                         k = j
  969.                                     END IF
  970.                                 END IF
  971.                             NEXT
  972.                             SendFleet dest, k, star(dest).t * 0.90
  973.                             star(dest).t = 0
  974.                             star(dest).o = fleet(i).o
  975.                             star(dest).t = fleet(i).t
  976.                             star(dest).o = fleet(i).o
  977.                             fleet(i).o = 0
  978.                             fltcnt = fltcnt - 1
  979.                         ELSE
  980.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  981.                                 alive = 1
  982.                                 WHILE alive
  983.                                     alive = 0
  984.                                     damorg = fleet(i).t / 10 + 1
  985.                                     damdst = star(dest).t / 8 + 1
  986.                                     fleet(i).t = fleet(i).t - damdst
  987.                                     star(dest).t = star(dest).t - damorg
  988.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  989.                                         alive = 1
  990.                                     END IF
  991.                                 WEND
  992.                                 IF star(dest).t < 1 THEN
  993.                                     star(dest).t = fleet(i).t
  994.                                     star(dest).o = fleet(i).o
  995.                                 END IF
  996.                                 fleet(i).o = 0
  997.                                 fltcnt = fltcnt - 1
  998.                             ELSE
  999.                                 k = 100
  1000.                                 shortest = 10000
  1001.                                 FOR j = 0 TO 99
  1002.                                     IF star(j).o = fleet(i).o THEN
  1003.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1004.                                         IF dist < shortest THEN
  1005.                                             shortest = dist
  1006.                                             k = j
  1007.                                         END IF
  1008.                                     END IF
  1009.                                 NEXT
  1010.                                 IF k < 100 THEN
  1011.                                     fleet(i).x2 = star(k).x
  1012.                                     fleet(i).y2 = star(k).y
  1013.                                     fleet(i).d = k
  1014.                                 ELSE
  1015.                                     fleet(i).o = 0
  1016.                                     fltcnt = fltcnt - 1
  1017.                                 END IF
  1018.                             END IF
  1019.                         END IF
  1020.                     END IF
  1021.                 END IF
  1022.             END IF
  1023.             i = i + 1
  1024.         WEND
  1025.     END IF
  1026.  
  1027. SUB WorldPanel (i)
  1028.     x1 = star(i).x - 420 * ratio
  1029.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1030.     x2 = x1 + 400 * ratio
  1031.     y1 = star(i).y
  1032.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1033.     y2 = y1 + 225 * ratio
  1034.     _DEST wp
  1035.     CLS 0, 8
  1036.     COLOR 0, 8
  1037.     _FONT ttf72
  1038.     n$ = RTRIM$(star(i).n)
  1039.     l = _PRINTWIDTH(n$)
  1040.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1041.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1042.     COLOR 7, 8
  1043.     _FONT ttf36
  1044.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1045.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1046.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1047.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1048.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1049.     n$ = "NO"
  1050.     FOR j = 0 TO 99
  1051.         IF star(i).o <> star(j).o THEN
  1052.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1053.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1054.                 IF dist <= 250 THEN
  1055.                     n$ = "YES"
  1056.                     EXIT FOR
  1057.                 END IF
  1058.             END IF
  1059.         END IF
  1060.     NEXT
  1061.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1062.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1063.     _DEST 0
  1064.  
  1065. SUB NewGame
  1066.     DIM k AS INTEGER
  1067.     DIM r AS INTEGER
  1068.     DIM dx AS INTEGER
  1069.     DIM dy AS INTEGER
  1070.     DIM n AS STRING * 10
  1071.     paused = 1
  1072.     FOR i = 0 TO 999
  1073.         fleet(i).o = 0
  1074.     NEXT
  1075.     slct = 0
  1076.     fltcnt = 0
  1077.     LL = 0
  1078.     seed = RND * 1000
  1079.     FOR i = 0 TO 99
  1080.         k = 1
  1081.         WHILE k
  1082.             k = 0
  1083.             x = RND * (sw - sww) + swn
  1084.             y = RND * (sh - shw) + shn
  1085.             r = INT(RND * 200)
  1086.             n = names(r)
  1087.             FOR j = 0 TO i - 1
  1088.                 dx = x - star(j).x
  1089.                 dy = y - star(j).y
  1090.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1091.                     k = 1
  1092.                 END IF
  1093.                 IF n = star(j).n THEN
  1094.                     k = 1
  1095.                 END IF
  1096.             NEXT
  1097.         WEND
  1098.         star(i).n = n
  1099.         star(i).x = x
  1100.         star(i).y = y
  1101.         star(i).c = RND * 6 + 9
  1102.         star(i).s = RND * 5
  1103.         star(i).o = 0
  1104.         star(i).p = star(i).s + (RND * 5) + 3
  1105.         star(i).t = 0
  1106.         order(i).src = 100
  1107.     NEXT
  1108.     FOR i = 1 TO 6
  1109.         ok = 0
  1110.         WHILE (ok < 1)
  1111.             ok = 1
  1112.             j = RND * 100
  1113.             FOR k = 1 TO i - 1
  1114.                 dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1115.                 IF dist < 500 * ratio THEN
  1116.                     ok = 0
  1117.                     EXIT FOR
  1118.                 END IF
  1119.             NEXT
  1120.             IF ok = 1 THEN
  1121.                 ok = -1
  1122.                 FOR k = 0 TO 99
  1123.                     dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1124.                     IF dist <= 200 THEN ok = ok + 1
  1125.                     IF ok = 2 THEN EXIT FOR
  1126.                 NEXT
  1127.             END IF
  1128.         WEND
  1129.         home(i) = j
  1130.         star(j).o = i
  1131.         star(j).p = 10
  1132.         star(j).t = 100
  1133.         star(j).s = 4
  1134.     NEXT
  1135.     star(home(1)).n = "Sol"
  1136.     star(home(1)).c = 14
  1137.     QuickSave
  1138.  
  1139. ' A lot of star names I made up
  1140.  
  1141. SUB StarNames
  1142.     names(0) = "Acamar"
  1143.     names(1) = "Arcab"
  1144.     names(2) = "Acrux"
  1145.     names(3) = "Adhara"
  1146.     names(4) = "Arneb"
  1147.     names(5) = "Antares"
  1148.     names(6) = "Arcturus"
  1149.     names(7) = "Atria"
  1150.     names(8) = "Beid"
  1151.     names(9) = "Betelgeuse"
  1152.     names(10) = "Botein"
  1153.     names(11) = "Beemim"
  1154.     names(12) = "Bellatrix"
  1155.     names(13) = "Bharani"
  1156.     names(14) = "Biham"
  1157.     names(15) = "Brachium"
  1158.     names(16) = "Canopus"
  1159.     names(17) = "Capella"
  1160.     names(18) = "Castor"
  1161.     names(19) = "Chara"
  1162.     names(20) = "Cursa"
  1163.     names(21) = "Copernicus"
  1164.     names(22) = "Chalawan"
  1165.     names(23) = "Chertan"
  1166.     names(24) = "Dabih"
  1167.     names(25) = "Dalim"
  1168.     names(26) = "Deneb"
  1169.     names(27) = "Denebola"
  1170.     names(28) = "Diadem"
  1171.     names(29) = "Diphda"
  1172.     names(30) = "Dschubba"
  1173.     names(31) = "Dziban"
  1174.     names(32) = "Edasich"
  1175.     names(33) = "Electra"
  1176.     names(34) = "Elgafar"
  1177.     names(35) = "Elkurud"
  1178.     names(36) = "Elnath"
  1179.     names(37) = "Eltanin"
  1180.     names(38) = "Enif"
  1181.     names(39) = "Errai"
  1182.     names(40) = "Fafnir"
  1183.     names(41) = "Fang"
  1184.     names(42) = "Fawaris"
  1185.     names(43) = "Felis"
  1186.     names(44) = "Fomalhaut"
  1187.     names(45) = "Fulu"
  1188.     names(46) = "Fumal"
  1189.     names(47) = "Furud"
  1190.     names(48) = "Garnet"
  1191.     names(49) = "Giausar"
  1192.     names(50) = "Gienah"
  1193.     names(51) = "Ginan"
  1194.     names(52) = "Gomeisa"
  1195.     names(53) = "Graffias"
  1196.     names(54) = "Grumium"
  1197.     names(55) = "Gudja"
  1198.     names(56) = "Hadar"
  1199.     names(57) = "Haedus"
  1200.     names(58) = "Hamal"
  1201.     names(59) = "Hassaleh"
  1202.     names(60) = "Hatysa"
  1203.     names(61) = "Helvetios"
  1204.     names(62) = "Heze"
  1205.     names(63) = "Homan"
  1206.     names(64) = "Iklil"
  1207.     names(65) = "Imai"
  1208.     names(66) = "Intercrus"
  1209.     names(67) = "Izar"
  1210.     names(68) = "Iccar"
  1211.     names(69) = "Inar"
  1212.     names(70) = "Iaeth"
  1213.     names(71) = "Imaous"
  1214.     names(72) = "Jabbah"
  1215.     names(73) = "Jishui"
  1216.     names(74) = "Jax"
  1217.     names(75) = "Jalae"
  1218.     names(76) = "Jewel"
  1219.     names(77) = "Jumbo"
  1220.     names(78) = "Jerue"
  1221.     names(79) = "Jabear"
  1222.     names(80) = "Kakkab"
  1223.     names(81) = "Kang"
  1224.     names(82) = "Kekouan"
  1225.     names(83) = "Keid"
  1226.     names(84) = "Kitalpha"
  1227.     names(85) = "Kochab"
  1228.     names(86) = "Kolob"
  1229.     names(87) = "Kobol"
  1230.     names(88) = "Larawag"
  1231.     names(89) = "Lesath"
  1232.     names(90) = "Libertas"
  1233.     names(91) = "Lich"
  1234.     names(92) = "Lilly"
  1235.     names(93) = "Laddel"
  1236.     names(94) = "Luminous"
  1237.     names(95) = "Lasacious"
  1238.     names(96) = "Mizar"
  1239.     names(97) = "Markab"
  1240.     names(98) = "Matar"
  1241.     names(99) = "Mintaka"
  1242.     names(100) = "Meleph"
  1243.     names(101) = "Menkar"
  1244.     names(102) = "Merga"
  1245.     names(103) = "Merope"
  1246.     names(104) = "Nahn"
  1247.     names(105) = "Naos"
  1248.     names(106) = "Nashira"
  1249.     names(107) = "Navi"
  1250.     names(108) = "Nekkar"
  1251.     names(109) = "Nembus"
  1252.     names(110) = "Nihal"
  1253.     names(111) = "Nunki"
  1254.     names(112) = "Ogma"
  1255.     names(113) = "Okab"
  1256.     names(114) = "Ohmy"
  1257.     names(115) = "Oragami"
  1258.     names(116) = "Origen"
  1259.     names(117) = "Omanii"
  1260.     names(118) = "Obytewa"
  1261.     names(119) = "Oglok"
  1262.     names(120) = "Phact"
  1263.     names(121) = "Pherkad"
  1264.     names(122) = "Pleione"
  1265.     names(122) = "Polaris"
  1266.     names(123) = "Pollux"
  1267.     names(124) = "Procyon"
  1268.     names(125) = "Proxima"
  1269.     names(126) = "Polis"
  1270.     names(127) = "Quaint"
  1271.     names(128) = "QB64"
  1272.     names(129) = "Quetzal"
  1273.     names(130) = "Qussol"
  1274.     names(131) = "Quella"
  1275.     names(132) = "Quyaeo"
  1276.     names(133) = "Ququdas"
  1277.     names(134) = "Quekak"
  1278.     names(135) = "Rasalas"
  1279.     names(136) = "Regor"
  1280.     names(137) = "Regulus"
  1281.     names(138) = "Rigel"
  1282.     names(139) = "Revati"
  1283.     names(140) = "Rotenev"
  1284.     names(141) = "Rukbat"
  1285.     names(142) = "Rastaban"
  1286.     names(143) = "Sabik"
  1287.     names(144) = "Sadr"
  1288.     names(145) = "Saiph"
  1289.     names(146) = "Sargas"
  1290.     names(147) = "Sarin"
  1291.     names(148) = "Syrma"
  1292.     names(149) = "Spica"
  1293.     names(150) = "Sirius"
  1294.     names(151) = "Tarazed"
  1295.     names(152) = "Taygeta"
  1296.     names(153) = "Tejat"
  1297.     names(154) = "Thabit"
  1298.     names(155) = "Thuban"
  1299.     names(156) = "Tiaki"
  1300.     names(157) = "Toliman"
  1301.     names(158) = "Torcular"
  1302.     names(157) = "Umala"
  1303.     names(158) = "Ulatte"
  1304.     names(159) = "Ubbessa"
  1305.     names(160) = "Unoless"
  1306.     names(161) = "Umaddem"
  1307.     names(162) = "Ummbra"
  1308.     names(162) = "Uniqu"
  1309.     names(163) = "Uzzaal"
  1310.     names(164) = "Vega"
  1311.     names(165) = "Veritate"
  1312.     names(166) = "Vindetrix"
  1313.     names(167) = "Vedas"
  1314.     names(168) = "Vergg"
  1315.     names(169) = "Vacant"
  1316.     names(170) = "Vucae"
  1317.     names(171) = "Vicar"
  1318.     names(172) = "Wasat"
  1319.     names(173) = "Wazn"
  1320.     names(174) = "Wezen"
  1321.     names(175) = "Waiten"
  1322.     names(176) = "Wachar"
  1323.     names(177) = "Wheelz"
  1324.     names(178) = "Whatsp"
  1325.     names(179) = "Wassand"
  1326.     names(180) = "Xenno"
  1327.     names(181) = "Xyphod"
  1328.     names(182) = "Xu"
  1329.     names(183) = "Xaal"
  1330.     names(184) = "Xyross"
  1331.     names(185) = "Xiggot"
  1332.     names(186) = "Xirrks"
  1333.     names(187) = "Yed"
  1334.     names(188) = "Yildun"
  1335.     names(189) = "Yundun"
  1336.     names(190) = "Yavyo"
  1337.     names(191) = "Yotrac"
  1338.     names(192) = "Yxzoqu"
  1339.     names(193) = "Ynnot"
  1340.     names(194) = "Zaniah"
  1341.     names(195) = "Zaurak"
  1342.     names(196) = "Zhang"
  1343.     names(197) = "Zibal"
  1344.     names(198) = "Zosma"
  1345.     names(199) = "Zuben"
  1346.  
« Last Edit: January 19, 2020, 01:30:36 am by romichess »
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #7 on: January 19, 2020, 03:15:25 am »
Fixed another small bug. This one I remember, "end if" in wrong place. Added "Demo Mode" to the game panel. Left click on "Demo Mode" and the computer will play for the human. Left click again to place back in human play mode. However, the human can still enter orders while in demo mode.
Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57. sw = _DESKTOPWIDTH '                   native video with of syatem
  58. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  59. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  60. nw = 1920
  61.  
  62. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  63.  
  64. shw = sh / 20
  65. shn = sh / 40
  66. nh = 1080
  67.  
  68. tt = 0
  69. lcx = sw
  70. rcx = sw
  71. cp = 100
  72. h = 100
  73. ar = 0
  74. rng = 200
  75. slct = 0
  76. strng = ""
  77. strng0 = ""
  78. strng1 = ""
  79. src = 100
  80. dst = 100
  81. ord.src = 100
  82. ncp = 5
  83. bmp = 2
  84.  
  85. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  86.  
  87.  
  88. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  89. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  90. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  91. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  92.  
  93. StarNames
  94.  
  95. NewGame
  96.  
  97. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  98. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  99. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  100. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  101.  
  102. repeat = 1
  103.  
  104. WHILE repeat
  105.  
  106.     CLS
  107.  
  108.     PaintBackground
  109.  
  110.     PaintStars
  111.  
  112.     PaintFleet
  113.  
  114.     FOR it = 0 TO speed
  115.  
  116.         Update
  117.  
  118.         GetInput
  119.  
  120.         Player
  121.  
  122.         Computer
  123.  
  124.     NEXT
  125.  
  126.     _DISPLAY
  127.  
  128.  
  129.  
  130. SUB Computer
  131.  
  132.     IF paused = 0 THEN
  133.         id = INT(RND * ncp) + bmp
  134.         i = home(id)
  135.         IF star(i).o <> id THEN
  136.             FOR j = 0 TO 99
  137.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  138.             NEXT
  139.         END IF
  140.  
  141.         FOR p = 0 TO 3
  142.  
  143.             IF p = 0 THEN
  144.                 IF star(i).t > LL THEN
  145.                     away = 10000
  146.                     FOR j = 0 TO 99
  147.                         IF star(j).o <> id THEN
  148.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  149.                             IF dist < away THEN
  150.                                 away = dist
  151.                                 o = star(j).o
  152.                             END IF
  153.                         END IF
  154.                     NEXT
  155.                     away1 = 10000
  156.                     away2 = 10000
  157.                     jay1 = 100
  158.                     jay2 = 100
  159.                     FOR j = 0 TO 99
  160.                         IF star(j).o = o THEN
  161.                             IF star(j).d > 0 THEN
  162.                                 star(j).d = star(j).d - 1
  163.                             ELSE
  164.                                 ok = 1
  165.                                 FOR k = 0 TO 99
  166.                                     IF star(k).o = id THEN
  167.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  168.                                         IF dist <= 250 THEN
  169.                                             ok = 1
  170.                                             EXIT FOR
  171.                                         END IF
  172.                                     END IF
  173.                                 NEXT
  174.                                 dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  175.                                 IF dist < away1 THEN
  176.                                     IF away1 < away2 THEN
  177.                                         away2 = away1
  178.                                         jay2 = jay1
  179.                                     END IF
  180.                                     away1 = dist
  181.                                     jay1 = j
  182.                                 ELSE
  183.                                     IF dist < away2 THEN
  184.                                         away2 = dist
  185.                                         jay2 = j
  186.                                     END IF
  187.                                 END IF
  188.                             END IF
  189.                         END IF
  190.                     NEXT
  191.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  192.                         SendFleet i, jay1, star(i).t / 1.5
  193.                         star(jay1).d = 400
  194.                     ELSE
  195.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  196.                             SendFleet i, jay2, star(i).t / 1.5
  197.                             star(jay2).d = 400
  198.                         END IF
  199.                     END IF
  200.                 END IF
  201.             END IF
  202.  
  203.             IF p = 1 THEN
  204.                 sf2 = 100
  205.                 FOR i = 0 TO 99
  206.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  207.                         sf3 = star(i).t / 2.5
  208.                         FOR j = 0 TO 99
  209.                             IF star(j).d > 0 THEN
  210.                                 star(j).d = star(j).d - 1
  211.                             ELSE
  212.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  213.                                     FOR k = 0 TO 99
  214.                                         IF star(k).o = id THEN
  215.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  216.                                             IF dist <= 250 * ratio THEN
  217.                                                 sf1 = i
  218.                                                 sf2 = j
  219.                                                 EXIT FOR
  220.                                             END IF
  221.                                         END IF
  222.                                     NEXT
  223.                                 END IF
  224.                             END IF
  225.                         NEXT
  226.                         IF sf2 < 100 THEN EXIT FOR
  227.                     END IF
  228.                 NEXT
  229.                 IF sf2 < 100 THEN
  230.                     SendFleet sf1, sf2, sf3
  231.                     star(sf2).d = 400
  232.                     EXIT FOR
  233.                 END IF
  234.             END IF
  235.  
  236.             IF p = 2 THEN
  237.                 FOR i = 0 TO 99
  238.                     IF i <> home(id) AND star(i).o = id THEN
  239.                         IF star(i).t > 49 THEN
  240.                             ok = 1
  241.                             FOR j = 0 TO 99
  242.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  243.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  244.                                     IF dist <= 400 * ratio THEN
  245.                                         ok = 0
  246.                                         EXIT FOR
  247.                                     END IF
  248.                                 END IF
  249.                             NEXT
  250.                             IF ok = 1 THEN
  251.                                 SendFleet i, home(id), star(i).t
  252.                                 EXIT FOR
  253.                             END IF
  254.                         END IF
  255.                     END IF
  256.                 NEXT
  257.                 IF ok = 1 THEN EXIT FOR
  258.             END IF
  259.  
  260.             IF p = 3 THEN
  261.                 ok = 0
  262.                 FOR i = 0 TO 99
  263.                     IF i <> home(id) AND star(i).o = id THEN
  264.                         IF star(i).t > LL * 1.5 + star(i).p * 50 THEN
  265.                             ok = 1
  266.                             EXIT FOR
  267.                         END IF
  268.                     END IF
  269.                 NEXT
  270.                 IF ok = 1 THEN
  271.                     SendFleet i, home(id), star(i).t / 4
  272.                     EXIT FOR
  273.                 END IF
  274.             END IF
  275.  
  276.         NEXT
  277.  
  278.     END IF
  279.  
  280. SUB GamePanel
  281.     x1 = sw / 4
  282.     y1 = sh / 4
  283.     _DEST gp
  284.     COLOR 0, 8
  285.     CLS
  286.     _FONT ttf72
  287.     n$ = "Beyond The Stars"
  288.     l = _PRINTWIDTH(n$)
  289.     _PRINTSTRING ((960 - l) / 2, 12), n$
  290.     LINE (40, 100)-(920, 100), 0
  291.     COLOR 7, 8
  292.     _FONT ttf36
  293.     _PRINTSTRING (42, 120), "Save"
  294.     _PRINTSTRING (42, 180), "Load"
  295.     COLOR 0, 7
  296.     FOR i = 143 TO 874 STEP 81
  297.         LINE (i, 115)-(i + 39, 158), 7, BF
  298.         LINE (i, 175)-(i + 39, 218), 7, BF
  299.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  300.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  301.     NEXT
  302.     n$ = "Custom Mode"
  303.     c = 7
  304.     IF cm = 1 THEN c = 168
  305.     l = _PRINTWIDTH(n$)
  306.     LINE (40, 235)-(60 + l, 295), c, BF
  307.     COLOR 0, c
  308.     _PRINTSTRING (50, 250), n$
  309.     n$ = "Demo Mode"
  310.     c = 7
  311.     IF dm = 1 THEN c = 168
  312.     l2 = _PRINTWIDTH(n$)
  313.     LINE (80 + l, 235)-(100 + l + l2, 295), c, BF
  314.     COLOR 0, c
  315.     _PRINTSTRING (90 + l, 250), n$
  316.     COLOR 7, 8
  317.     n$ = "Right Click To Cancel"
  318.     l = _PRINTWIDTH(n$)
  319.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  320.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  321.     _DEST 0
  322.  
  323. SUB GetInput
  324.  
  325.     IF ch = CHR$(27) THEN repeat = 0
  326.     IF ch = "n" THEN NewGame
  327.     IF ch = "t" THEN tt = 1 - tt
  328.     IF ch = "p" THEN paused = 1 - paused
  329.     IF ch = "+" THEN
  330.         IF speed < 10 THEN speed = speed + 1
  331.     END IF
  332.     IF ch = "-" THEN
  333.         IF speed > 0 THEN speed = speed - 1
  334.     END IF
  335.     IF ch = "q" THEN QuickSave
  336.     IF ch = "l" THEN QuickRestore
  337.     IF ch = "g" THEN
  338.         gact = 1
  339.         paused = 1
  340.     END IF
  341.     ch = INKEY$
  342.  
  343.  
  344.     lclk = 0
  345.     rclk = 0
  346.  
  347.  
  348.         lmb = _MOUSEBUTTON(1)
  349.         rmb = _MOUSEBUTTON(2)
  350.  
  351.         x = _MOUSEX
  352.  
  353.         IF lmb AND lcx = sw THEN lcx = x
  354.         IF rmb AND rcx = sw THEN rcx = x
  355.  
  356.     WEND
  357.  
  358.     x = _MOUSEX
  359.     y = _MOUSEY
  360.  
  361.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  362.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  363.  
  364.     lcx = sw
  365.     rcx = sw
  366.  
  367.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  368.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  369.             rclk = 0
  370.             oact = 0
  371.             pact = 0
  372.             gact = 0
  373.         ELSE
  374.             i = Identify
  375.             IF i = 100 THEN
  376.                 IF src = 100 THEN
  377.                     paused = 1 - paused
  378.                     ch = ""
  379.                 ELSE
  380.                     src = 100
  381.                 END IF
  382.                 rclk = 0
  383.             END IF
  384.         END IF
  385.     END IF
  386.  
  387.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 THEN
  388.         i = Identify
  389.         IF i = 100 THEN
  390.             gact = 1
  391.         END IF
  392.     END IF
  393.  
  394.  
  395. FUNCTION Identify
  396.     ii = 100
  397.     FOR i = 0 TO 99
  398.         dx = star(i).x - x
  399.         dy = star(i).y - y
  400.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  401.             ii = i
  402.             EXIT FOR
  403.         END IF
  404.     NEXT
  405.     Identify = ii
  406.  
  407. SUB OrderPanel (i)
  408.     x1 = star(i).x - 420 * ratio
  409.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  410.     x2 = x1 + 400 * ratio
  411.     y1 = star(i).y
  412.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  413.     y2 = y1 + 225 * ratio
  414.     _DEST op
  415.     CLS 0, 8
  416.     COLOR 0, 8
  417.     _FONT ttf72
  418.     n$ = RTRIM$(star(i).n)
  419.     l = _PRINTWIDTH(n$)
  420.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  421.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  422.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  423.     COLOR 7, 8
  424.     _FONT ttf36
  425.     IF box = 0 THEN
  426.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  427.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  428.         LINE (xo, yo)-(xd, yd), 7, BF
  429.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  430.         LINE (xo, yo)-(xd, yd), 7, BF
  431.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  432.         LINE (xo, yo)-(xd, yd), 7, BF
  433.         n$ = RTRIM$(strng0)
  434.         COLOR 0, 7
  435.         _FONT ttf24
  436.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  437.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  438.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  439.     END IF
  440.     IF box = 1 THEN
  441.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  442.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  443.         LINE (xo, yo)-(xd, yd), 7, BF
  444.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  445.         LINE (xo, yo)-(xd, yd), 7, BF
  446.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  447.         LINE (xo, yo)-(xd, yd), 7, BF
  448.         n$ = RTRIM$(strng1)
  449.         COLOR 0, 7
  450.         _FONT ttf24
  451.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  452.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  453.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  454.     END IF
  455.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  456.     _DEST 0
  457.     oanx = x1: oany = y1
  458.  
  459. SUB PaintBackground
  460.     x = RND * sw
  461.     y = RND * sh
  462.     c = RND * 14 + 1
  463.     PSET (x, y), c
  464.     RANDOMIZE USING seed
  465.     FOR i = 1 TO 600 * ratio
  466.         x = RND * sw
  467.         y = RND * sh
  468.         c = RND * 14 + 1
  469.         PSET (x, y), c
  470.     NEXT
  471.  
  472. SUB PaintFleet
  473.     count = fltcnt
  474.     i = 0
  475.     WHILE count
  476.         IF fleet(i).o <> 0 THEN
  477.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  478.             count = count - 1
  479.         END IF
  480.         i = i + 1
  481.     WEND
  482.  
  483. SUB PaintStars
  484.  
  485.     'execute standing orders
  486.     FOR i = 0 TO 99
  487.         IF order(i).src <> 100 THEN
  488.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  489.                 order(i).src = 100
  490.             ELSE
  491.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  492.                 IF star(i).t >= order(i).ovr THEN
  493.                     SendFleet order(i).src, order(i).dst, order(i).shp
  494.                 END IF
  495.             END IF
  496.         END IF
  497.     NEXT
  498.  
  499.     FOR i = 0 TO 99
  500.         c = star(i).c
  501.         x = star(i).x
  502.         y = star(i).y
  503.         o = star(i).o
  504.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  505.         COLOR 15
  506.         IF o > 0 THEN
  507.             PAINT (x, y), o + 8, c
  508.         END IF
  509.         _FONT ttf16
  510.         IF tt THEN
  511.             n$ = star(i).n
  512.             n$ = RTRIM$(n$)
  513.             l = _PRINTWIDTH(n$)
  514.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  515.         ELSE
  516.             n$ = STR$(star(i).t)
  517.             l = _PRINTWIDTH(n$)
  518.         END IF
  519.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  520.     NEXT
  521.  
  522.  
  523. SUB Player
  524.  
  525.     ' Custom Map Mode
  526.     IF cm = 1 THEN
  527.         IF lmb THEN
  528.             i = Identify
  529.             IF i < 100 THEN
  530.                 WHILE _MOUSEINPUT: WEND
  531.                 nx = _MOUSEX
  532.                 ny = _MOUSEY
  533.                 ok = 1
  534.                 FOR j = 0 TO 99
  535.                     IF j <> i THEN
  536.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  537.                         IF dist <= 60 THEN
  538.                             ok = 0
  539.                             EXIT FOR
  540.                         END IF
  541.                     END IF
  542.                 NEXT
  543.                 IF ok = 1 THEN
  544.                     star(i).x = nx
  545.                     star(i).y = ny
  546.                 ELSE
  547.                     _MOUSEMOVE star(i).x, star(i).y
  548.                 END IF
  549.             END IF
  550.         END IF
  551.     END IF
  552.  
  553.     'Add new order to standing orders
  554.     IF ord.src <> 100 THEN
  555.         i = ord.src
  556.         IF ord.shp = 0 THEN
  557.             order(i).src = 100
  558.         ELSE
  559.             order(i) = ord
  560.         END IF
  561.         src = 100
  562.         ord.src = 100
  563.     END IF
  564.  
  565.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  566.  
  567.         'If there is no source star see if we can get one
  568.         IF src = 100 AND cm = 0 THEN
  569.             i = Identify
  570.             IF i < 100 THEN WorldPanel i
  571.             IF lclk = 1 OR rclk = 1 THEN
  572.                 lclk = 0
  573.                 rclk = 0
  574.                 src = i
  575.             END IF
  576.         END IF
  577.  
  578.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  579.         IF src <> 100 THEN
  580.             c = 12
  581.             FOR i = 0 TO 99
  582.                 IF star(i).o = 1 THEN
  583.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  584.                     IF dist <= 251 * ratio THEN
  585.                         c = 10
  586.                         EXIT FOR
  587.                     END IF
  588.                 END IF
  589.             NEXT
  590.             i = Identify
  591.             IF i <> 100 THEN
  592.                 x = star(i).x
  593.                 y = star(i).y
  594.             END IF
  595.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  596.             LINE (star(src).x, star(src).y)-(x, y), c
  597.             n$ = STR$(INT(rang))
  598.             _FONT ttf16
  599.             _PRINTSTRING (x + 20, y), n$, 0
  600.         END IF
  601.  
  602.         'If we have a source star see if we clicked on a destination star
  603.         IF src <> 100 THEN
  604.             IF lclk = 1 OR rclk = 1 THEN
  605.                 i = Identify
  606.                 IF i = src THEN
  607.                     lclk = 0
  608.                     src = 100
  609.                     IF rclk = 1 THEN
  610.                         rclk = 0
  611.                         order(i).src = 100
  612.                     END IF
  613.                 ELSE
  614.                     IF i < 100 AND i <> src THEN
  615.                         IF lclk = 1 THEN
  616.                             lclk = 0
  617.                             FOR j = 0 TO 99
  618.                                 IF star(j).o = 1 THEN
  619.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  620.                                     IF dist <= 250 THEN
  621.                                         dst = i
  622.                                         pact = 1
  623.                                         EXIT FOR
  624.                                     END IF
  625.                                 END IF
  626.                             NEXT
  627.                         ELSE
  628.                             rclk = 0
  629.                             dst = i
  630.                             IF star(i).o = 1 THEN
  631.                                 oact = 1
  632.                             END IF
  633.                         END IF
  634.                     END IF
  635.                 END IF
  636.             END IF
  637.         END IF
  638.     END IF
  639.  
  640.     'If the game panel is active
  641.     IF gact = 1 THEN
  642.         GamePanel
  643.         IF lclk = 1 THEN
  644.             FOR i = 143 TO 874 STEP 81
  645.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  646.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  647.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  648.                     SaveGame n$
  649.                 END IF
  650.                 y1 = y1 + 60: y2 = y2 + 60
  651.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  652.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  653.                     LoadGame n$
  654.                 END IF
  655.             NEXT
  656.             IF fltcnt = 0 THEN
  657.                 _FONT ttf36
  658.                 x1 = 40 + sw / 4: x2 = x1 + 20 + _PRINTWIDTH("Custom Mode"): y1 = 235 + sh / 4: y2 = y1 + 60
  659.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  660.                     cm = 1 - cm
  661.                 END IF
  662.             END IF
  663.             _FONT ttf36
  664.             x1 = 80 + sw / 4 + _PRINTWIDTH("Custom Mode"): x2 = x1 + 20 + _PRINTWIDTH("Demo Mode")
  665.             y1 = 235 + sh / 4: y2 = y1 + 60
  666.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  667.                 dm = 1 - dm
  668.                 IF dm = 0 THEN
  669.                     ncp = 5
  670.                     bmp = 2
  671.                 ELSE
  672.                     ncp = 6
  673.                     bmp = 1
  674.                 END IF
  675.             END IF
  676.         END IF
  677.     END IF
  678.  
  679.     'If the star standing orders panel is active
  680.     IF oact = 1 THEN
  681.  
  682.         IF star(src).o = 1 THEN
  683.             OrderPanel dst
  684.         END IF
  685.  
  686.         IF rclk = 1 THEN oact = 0
  687.  
  688.         IF box = 0 THEN
  689.             tmp$ = RTRIM$(strng0)
  690.         ELSE
  691.             tmp$ = RTRIM$(strng1)
  692.         END IF
  693.  
  694.         IF lclk = 1 THEN
  695.  
  696.             x1 = oanx: x2 = oanx + 400 * ratio
  697.             y1 = oany: y2 = oany + 540 * ratio
  698.  
  699.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  700.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  701.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  702.                     IF box = 0 THEN
  703.                         n$ = RTRIM$(strng0)
  704.                         l = LEN(n$)
  705.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  706.                     ELSE
  707.                         n$ = RTRIM$(strng1)
  708.                         l = LEN(n$)
  709.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  710.                     END IF
  711.                 END IF
  712.             END IF
  713.  
  714.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  715.  
  716.                 IF box = 0 THEN
  717.  
  718.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  719.                         ord.ovr = INT(VAL(strng0))
  720.                         box = 1
  721.                     END IF
  722.  
  723.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  724.                         strng0 = ""
  725.                     END IF
  726.  
  727.                 ELSE
  728.  
  729.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  730.                         IF INT(VAL(strng1)) > ord.ovr THEN
  731.                             strng1 = ""
  732.                         ELSE
  733.                             box = 0
  734.                             oact = 0
  735.                             ord.src = src
  736.                             ord.dst = dst
  737.                             ord.shp = VAL(strng1)
  738.                             strng0 = ""
  739.                             strng1 = ""
  740.                         END IF
  741.                     END IF
  742.  
  743.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  744.                         strng0 = ""
  745.                         strng1 = ""
  746.                         box = 0
  747.                     END IF
  748.  
  749.                 END IF
  750.  
  751.             END IF
  752.         END IF
  753.         x1 = 10000: y1 = 10000
  754.  
  755.     END IF
  756.  
  757.  
  758.     'If the fleet send panel is active
  759.     IF pact = 1 THEN
  760.         IF rclk = 1 THEN pact = 0
  761.         IF star(src).o = 1 THEN
  762.             ShowPanel dst
  763.         END IF
  764.         IF lclk = 1 THEN
  765.             tmp$ = RTRIM$(strng)
  766.  
  767.             x1 = panx: x2 = panx + 400 * ratio
  768.             y1 = pany: y2 = pany + 540 * ratio
  769.  
  770.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  771.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  772.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  773.                     strng = tmp$ + STR$(dig)
  774.                 END IF
  775.             END IF
  776.  
  777.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  778.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  779.                     pact = 0
  780.                     value = star(src).t
  781.                     SendFleet src, dst, value
  782.                     src = 100
  783.                 END IF
  784.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  785.                     pact = 0
  786.                     value = star(src).t / 2
  787.                     SendFleet src, dst, value
  788.                     src = 100
  789.                 END IF
  790.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  791.                     pact = 0
  792.                     value = star(src).t / 3
  793.                     SendFleet src, dst, value
  794.                     src = 100
  795.                 END IF
  796.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  797.                     strng = ""
  798.                 END IF
  799.             END IF
  800.  
  801.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  802.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  803.                     value = VAL(strng)
  804.                     strng = ""
  805.                     pact = 0
  806.                     IF value <= star(src).t AND star(src).t <> o THEN
  807.                         SendFleet src, dst, value
  808.                     END IF
  809.                     src = 100
  810.                 END IF
  811.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  812.                     pact = 0
  813.                     src = 100
  814.                     strng = ""
  815.                 END IF
  816.             END IF
  817.         END IF
  818.     END IF
  819.  
  820. SUB QuickSave
  821.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  822.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  823.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  824.     qfltcnt = fltcnt
  825.     qLL = LL
  826.  
  827. SUB QuickRestore
  828.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  829.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  830.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  831.     fltcnt = qfltcnt
  832.     LL = qLL
  833.     paused = 1
  834.  
  835. SUB LoadGame (n$)
  836.     n$ = n$ + ".sav"
  837.     IF _FILEEXISTS(n$) THEN
  838.         OPEN n$ FOR BINARY AS #2
  839.         GET #2, , star()
  840.         GET #2, , order()
  841.         GET #2, , fleet()
  842.         GET #2, , home()
  843.         GET #2, , fltcnt
  844.         GET #2, , LL
  845.         CLOSE #2
  846.         PRINT "Game Loaded"
  847.     END IF
  848.  
  849. SUB SaveGame (n$)
  850.     n$ = n$ + ".sav"
  851.     OPEN n$ FOR BINARY AS #1
  852.     CLOSE #1
  853.     KILL n$
  854.     OPEN n$ FOR BINARY AS #1
  855.     PUT #1, , star()
  856.     PUT #1, , order()
  857.     PUT #1, , fleet()
  858.     PUT #1, , home()
  859.     PUT #1, , fltcnt
  860.     PUT #1, , LL
  861.     CLOSE #1
  862.     PRINT "Game Saved"
  863.  
  864. SUB SendFleet (src, dst, ships)
  865.     IF fltcnt < 2000 THEN
  866.         FOR i = 0 TO 1999
  867.             IF fleet(i).o = 0 THEN
  868.                 fleet(i).o = star(src).o
  869.                 fleet(i).d = dst
  870.                 fleet(i).x1 = star(src).x
  871.                 fleet(i).y1 = star(src).y
  872.                 fleet(i).x2 = star(dst).x
  873.                 fleet(i).y2 = star(dst).y
  874.                 fleet(i).t = ships
  875.                 star(src).t = star(src).t - ships
  876.                 fltcnt = fltcnt + 1
  877.                 EXIT FOR
  878.             END IF
  879.         NEXT
  880.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  881.     END IF
  882.  
  883. SUB ShowPanel (i)
  884.     x1 = star(i).x - 420 * ratio
  885.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  886.     x2 = x1 + 400 * ratio
  887.     y1 = star(i).y
  888.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  889.     y2 = y1 + 540 * ratio
  890.     _DEST sp
  891.     CLS 0, 8
  892.     COLOR 0, 8
  893.     _FONT ttf72
  894.     n$ = RTRIM$(star(src).n)
  895.     l = _PRINTWIDTH(n$)
  896.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  897.     n$ = "to"
  898.     l = _PRINTWIDTH(n$)
  899.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  900.     n$ = RTRIM$(star(dst).n)
  901.     l = _PRINTWIDTH(n$)
  902.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  903.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  904.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  905.     n$ = RTRIM$(strng)
  906.     l = _PRINTWIDTH(n$)
  907.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  908.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  909.     LINE (xo, yo)-(xd, yd), 7, BF
  910.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  911.     LINE (xo, yo)-(xd, yd), 7, BF
  912.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  913.     LINE (xo, yo)-(xd, yd), 7, BF
  914.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  915.     LINE (xo, yo)-(xd, yd), 7, BF
  916.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  917.     LINE (xo, yo)-(xd, yd), 7, BF
  918.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  919.     LINE (xo, yo)-(xd, yd), 7, BF
  920.     _FONT ttf24
  921.     COLOR 7, 8
  922.     n$ = RTRIM$(STR$(star(src).t))
  923.     l = _PRINTWIDTH(n$)
  924.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  925.     n$ = RTRIM$(STR$(star(dst).t))
  926.     l = _PRINTWIDTH(n$)
  927.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  928.     _FONT ttf16
  929.     COLOR 0, 7
  930.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  931.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  932.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  933.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  934.     _FONT ttf72
  935.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  936.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  937.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  938.     panx = x1: pany = y1
  939.     _DEST 0
  940.  
  941. SUB Update
  942.     IF paused = 0 THEN
  943.         RANDOMIZE TIMER
  944.         FOR i = 0 TO 99
  945.             r = INT(RND * 60)
  946.             IF r < star(i).p THEN
  947.                 IF star(i).o > 0 THEN
  948.                     star(i).t = star(i).t + 1
  949.                 ELSE
  950.                     IF INT(RND * 10) < 3 THEN
  951.                         star(i).t = star(i).t + 1
  952.                     END IF
  953.                 END IF
  954.             END IF
  955.         NEXT
  956.  
  957.         count = fltcnt
  958.         i = 0
  959.         WHILE count
  960.             IF fleet(i).o <> 0 THEN
  961.                 count = count - 1
  962.                 IF fleet(i).x2 > fleet(i).x1 THEN
  963.                     fleet(i).x1 = fleet(i).x1 + 1
  964.                 END IF
  965.                 IF fleet(i).x2 < fleet(i).x1 THEN
  966.                     fleet(i).x1 = fleet(i).x1 - 1
  967.                 END IF
  968.                 IF fleet(i).y2 > fleet(i).y1 THEN
  969.                     fleet(i).y1 = fleet(i).y1 + 1
  970.                 END IF
  971.                 IF fleet(i).y2 < fleet(i).y1 THEN
  972.                     fleet(i).y1 = fleet(i).y1 - 1
  973.                 END IF
  974.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  975.                     dest = fleet(i).d
  976.                     IF star(dest).o = fleet(i).o THEN
  977.                         star(dest).t = star(dest).t + fleet(i).t
  978.                         fleet(i).o = 0
  979.                         fltcnt = fltcnt - 1
  980.                     ELSE
  981.                         o = star(dest).o
  982.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  983.                             k = 100
  984.                             shortest = 10000
  985.                             FOR j = 0 TO 99
  986.                                 IF star(j).o = o THEN
  987.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  988.                                     IF dist < shortest THEN
  989.                                         shortest = dist
  990.                                         k = j
  991.                                     END IF
  992.                                 END IF
  993.                             NEXT
  994.                             SendFleet dest, k, star(dest).t * 0.90
  995.                             star(dest).t = 0
  996.                             star(dest).o = fleet(i).o
  997.                             star(dest).t = fleet(i).t
  998.                             star(dest).o = fleet(i).o
  999.                             fleet(i).o = 0
  1000.                             fltcnt = fltcnt - 1
  1001.                         ELSE
  1002.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  1003.                                 alive = 1
  1004.                                 WHILE alive
  1005.                                     alive = 0
  1006.                                     damorg = fleet(i).t / 10 + 1
  1007.                                     damdst = star(dest).t / 8 + 1
  1008.                                     fleet(i).t = fleet(i).t - damdst
  1009.                                     star(dest).t = star(dest).t - damorg
  1010.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  1011.                                         alive = 1
  1012.                                     END IF
  1013.                                 WEND
  1014.                                 IF star(dest).t < 1 THEN
  1015.                                     star(dest).t = fleet(i).t
  1016.                                     star(dest).o = fleet(i).o
  1017.                                 END IF
  1018.                                 fleet(i).o = 0
  1019.                                 fltcnt = fltcnt - 1
  1020.                             ELSE
  1021.                                 k = 100
  1022.                                 shortest = 10000
  1023.                                 FOR j = 0 TO 99
  1024.                                     IF star(j).o = fleet(i).o THEN
  1025.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1026.                                         IF dist < shortest THEN
  1027.                                             shortest = dist
  1028.                                             k = j
  1029.                                         END IF
  1030.                                     END IF
  1031.                                 NEXT
  1032.                                 IF k < 100 THEN
  1033.                                     fleet(i).x2 = star(k).x
  1034.                                     fleet(i).y2 = star(k).y
  1035.                                     fleet(i).d = k
  1036.                                 ELSE
  1037.                                     fleet(i).o = 0
  1038.                                     fltcnt = fltcnt - 1
  1039.                                 END IF
  1040.                             END IF
  1041.                         END IF
  1042.                     END IF
  1043.                 END IF
  1044.             END IF
  1045.             i = i + 1
  1046.         WEND
  1047.     END IF
  1048.  
  1049. SUB WorldPanel (i)
  1050.     x1 = star(i).x - 420 * ratio
  1051.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1052.     x2 = x1 + 400 * ratio
  1053.     y1 = star(i).y
  1054.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1055.     y2 = y1 + 225 * ratio
  1056.     _DEST wp
  1057.     CLS 0, 8
  1058.     COLOR 0, 8
  1059.     _FONT ttf72
  1060.     n$ = RTRIM$(star(i).n)
  1061.     l = _PRINTWIDTH(n$)
  1062.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1063.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1064.     COLOR 7, 8
  1065.     _FONT ttf36
  1066.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1067.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1068.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1069.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1070.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1071.     n$ = "NO"
  1072.     FOR j = 0 TO 99
  1073.         IF star(i).o <> star(j).o THEN
  1074.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1075.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1076.                 IF dist <= 250 THEN
  1077.                     n$ = "YES"
  1078.                     EXIT FOR
  1079.                 END IF
  1080.             END IF
  1081.         END IF
  1082.     NEXT
  1083.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1084.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1085.     _DEST 0
  1086.  
  1087. SUB NewGame
  1088.     DIM k AS INTEGER
  1089.     DIM r AS INTEGER
  1090.     DIM dx AS INTEGER
  1091.     DIM dy AS INTEGER
  1092.     DIM n AS STRING * 10
  1093.     paused = 1
  1094.     FOR i = 0 TO 999
  1095.         fleet(i).o = 0
  1096.     NEXT
  1097.     slct = 0
  1098.     fltcnt = 0
  1099.     LL = 0
  1100.     seed = RND * 1000
  1101.     FOR i = 0 TO 99
  1102.         k = 1
  1103.         WHILE k
  1104.             k = 0
  1105.             x = RND * (sw - sww) + swn
  1106.             y = RND * (sh - shw) + shn
  1107.             r = INT(RND * 200)
  1108.             n = names(r)
  1109.             FOR j = 0 TO i - 1
  1110.                 dx = x - star(j).x
  1111.                 dy = y - star(j).y
  1112.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1113.                     k = 1
  1114.                 END IF
  1115.                 IF n = star(j).n THEN
  1116.                     k = 1
  1117.                 END IF
  1118.             NEXT
  1119.         WEND
  1120.         star(i).n = n
  1121.         star(i).x = x
  1122.         star(i).y = y
  1123.         star(i).c = RND * 6 + 9
  1124.         star(i).s = RND * 5
  1125.         star(i).o = 0
  1126.         star(i).p = star(i).s + (RND * 5) + 3
  1127.         star(i).t = 0
  1128.         order(i).src = 100
  1129.     NEXT
  1130.     FOR i = 1 TO 6
  1131.         ok = 0
  1132.         WHILE (ok < 1)
  1133.             ok = 1
  1134.             j = RND * 100
  1135.             FOR k = 1 TO i - 1
  1136.                 dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1137.                 IF dist < 500 * ratio THEN
  1138.                     ok = 0
  1139.                     EXIT FOR
  1140.                 END IF
  1141.             NEXT
  1142.             IF ok = 1 THEN
  1143.                 ok = -1
  1144.                 FOR k = 0 TO 99
  1145.                     dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1146.                     IF dist <= 200 THEN ok = ok + 1
  1147.                     IF ok = 2 THEN EXIT FOR
  1148.                 NEXT
  1149.             END IF
  1150.         WEND
  1151.         home(i) = j
  1152.         star(j).o = i
  1153.         star(j).p = 10
  1154.         star(j).t = 100
  1155.         star(j).s = 4
  1156.     NEXT
  1157.     star(home(1)).n = "Sol"
  1158.     star(home(1)).c = 14
  1159.     QuickSave
  1160.  
  1161. ' A lot of star names I made up
  1162.  
  1163. SUB StarNames
  1164.     names(0) = "Acamar"
  1165.     names(1) = "Arcab"
  1166.     names(2) = "Acrux"
  1167.     names(3) = "Adhara"
  1168.     names(4) = "Arneb"
  1169.     names(5) = "Antares"
  1170.     names(6) = "Arcturus"
  1171.     names(7) = "Atria"
  1172.     names(8) = "Beid"
  1173.     names(9) = "Betelgeuse"
  1174.     names(10) = "Botein"
  1175.     names(11) = "Beemim"
  1176.     names(12) = "Bellatrix"
  1177.     names(13) = "Bharani"
  1178.     names(14) = "Biham"
  1179.     names(15) = "Brachium"
  1180.     names(16) = "Canopus"
  1181.     names(17) = "Capella"
  1182.     names(18) = "Castor"
  1183.     names(19) = "Chara"
  1184.     names(20) = "Cursa"
  1185.     names(21) = "Copernicus"
  1186.     names(22) = "Chalawan"
  1187.     names(23) = "Chertan"
  1188.     names(24) = "Dabih"
  1189.     names(25) = "Dalim"
  1190.     names(26) = "Deneb"
  1191.     names(27) = "Denebola"
  1192.     names(28) = "Diadem"
  1193.     names(29) = "Diphda"
  1194.     names(30) = "Dschubba"
  1195.     names(31) = "Dziban"
  1196.     names(32) = "Edasich"
  1197.     names(33) = "Electra"
  1198.     names(34) = "Elgafar"
  1199.     names(35) = "Elkurud"
  1200.     names(36) = "Elnath"
  1201.     names(37) = "Eltanin"
  1202.     names(38) = "Enif"
  1203.     names(39) = "Errai"
  1204.     names(40) = "Fafnir"
  1205.     names(41) = "Fang"
  1206.     names(42) = "Fawaris"
  1207.     names(43) = "Felis"
  1208.     names(44) = "Fomalhaut"
  1209.     names(45) = "Fulu"
  1210.     names(46) = "Fumal"
  1211.     names(47) = "Furud"
  1212.     names(48) = "Garnet"
  1213.     names(49) = "Giausar"
  1214.     names(50) = "Gienah"
  1215.     names(51) = "Ginan"
  1216.     names(52) = "Gomeisa"
  1217.     names(53) = "Graffias"
  1218.     names(54) = "Grumium"
  1219.     names(55) = "Gudja"
  1220.     names(56) = "Hadar"
  1221.     names(57) = "Haedus"
  1222.     names(58) = "Hamal"
  1223.     names(59) = "Hassaleh"
  1224.     names(60) = "Hatysa"
  1225.     names(61) = "Helvetios"
  1226.     names(62) = "Heze"
  1227.     names(63) = "Homan"
  1228.     names(64) = "Iklil"
  1229.     names(65) = "Imai"
  1230.     names(66) = "Intercrus"
  1231.     names(67) = "Izar"
  1232.     names(68) = "Iccar"
  1233.     names(69) = "Inar"
  1234.     names(70) = "Iaeth"
  1235.     names(71) = "Imaous"
  1236.     names(72) = "Jabbah"
  1237.     names(73) = "Jishui"
  1238.     names(74) = "Jax"
  1239.     names(75) = "Jalae"
  1240.     names(76) = "Jewel"
  1241.     names(77) = "Jumbo"
  1242.     names(78) = "Jerue"
  1243.     names(79) = "Jabear"
  1244.     names(80) = "Kakkab"
  1245.     names(81) = "Kang"
  1246.     names(82) = "Kekouan"
  1247.     names(83) = "Keid"
  1248.     names(84) = "Kitalpha"
  1249.     names(85) = "Kochab"
  1250.     names(86) = "Kolob"
  1251.     names(87) = "Kobol"
  1252.     names(88) = "Larawag"
  1253.     names(89) = "Lesath"
  1254.     names(90) = "Libertas"
  1255.     names(91) = "Lich"
  1256.     names(92) = "Lilly"
  1257.     names(93) = "Laddel"
  1258.     names(94) = "Luminous"
  1259.     names(95) = "Lasacious"
  1260.     names(96) = "Mizar"
  1261.     names(97) = "Markab"
  1262.     names(98) = "Matar"
  1263.     names(99) = "Mintaka"
  1264.     names(100) = "Meleph"
  1265.     names(101) = "Menkar"
  1266.     names(102) = "Merga"
  1267.     names(103) = "Merope"
  1268.     names(104) = "Nahn"
  1269.     names(105) = "Naos"
  1270.     names(106) = "Nashira"
  1271.     names(107) = "Navi"
  1272.     names(108) = "Nekkar"
  1273.     names(109) = "Nembus"
  1274.     names(110) = "Nihal"
  1275.     names(111) = "Nunki"
  1276.     names(112) = "Ogma"
  1277.     names(113) = "Okab"
  1278.     names(114) = "Ohmy"
  1279.     names(115) = "Oragami"
  1280.     names(116) = "Origen"
  1281.     names(117) = "Omanii"
  1282.     names(118) = "Obytewa"
  1283.     names(119) = "Oglok"
  1284.     names(120) = "Phact"
  1285.     names(121) = "Pherkad"
  1286.     names(122) = "Pleione"
  1287.     names(122) = "Polaris"
  1288.     names(123) = "Pollux"
  1289.     names(124) = "Procyon"
  1290.     names(125) = "Proxima"
  1291.     names(126) = "Polis"
  1292.     names(127) = "Quaint"
  1293.     names(128) = "QB64"
  1294.     names(129) = "Quetzal"
  1295.     names(130) = "Qussol"
  1296.     names(131) = "Quella"
  1297.     names(132) = "Quyaeo"
  1298.     names(133) = "Ququdas"
  1299.     names(134) = "Quekak"
  1300.     names(135) = "Rasalas"
  1301.     names(136) = "Regor"
  1302.     names(137) = "Regulus"
  1303.     names(138) = "Rigel"
  1304.     names(139) = "Revati"
  1305.     names(140) = "Rotenev"
  1306.     names(141) = "Rukbat"
  1307.     names(142) = "Rastaban"
  1308.     names(143) = "Sabik"
  1309.     names(144) = "Sadr"
  1310.     names(145) = "Saiph"
  1311.     names(146) = "Sargas"
  1312.     names(147) = "Sarin"
  1313.     names(148) = "Syrma"
  1314.     names(149) = "Spica"
  1315.     names(150) = "Sirius"
  1316.     names(151) = "Tarazed"
  1317.     names(152) = "Taygeta"
  1318.     names(153) = "Tejat"
  1319.     names(154) = "Thabit"
  1320.     names(155) = "Thuban"
  1321.     names(156) = "Tiaki"
  1322.     names(157) = "Toliman"
  1323.     names(158) = "Torcular"
  1324.     names(157) = "Umala"
  1325.     names(158) = "Ulatte"
  1326.     names(159) = "Ubbessa"
  1327.     names(160) = "Unoless"
  1328.     names(161) = "Umaddem"
  1329.     names(162) = "Ummbra"
  1330.     names(162) = "Uniqu"
  1331.     names(163) = "Uzzaal"
  1332.     names(164) = "Vega"
  1333.     names(165) = "Veritate"
  1334.     names(166) = "Vindetrix"
  1335.     names(167) = "Vedas"
  1336.     names(168) = "Vergg"
  1337.     names(169) = "Vacant"
  1338.     names(170) = "Vucae"
  1339.     names(171) = "Vicar"
  1340.     names(172) = "Wasat"
  1341.     names(173) = "Wazn"
  1342.     names(174) = "Wezen"
  1343.     names(175) = "Waiten"
  1344.     names(176) = "Wachar"
  1345.     names(177) = "Wheelz"
  1346.     names(178) = "Whatsp"
  1347.     names(179) = "Wassand"
  1348.     names(180) = "Xenno"
  1349.     names(181) = "Xyphod"
  1350.     names(182) = "Xu"
  1351.     names(183) = "Xaal"
  1352.     names(184) = "Xyross"
  1353.     names(185) = "Xiggot"
  1354.     names(186) = "Xirrks"
  1355.     names(187) = "Yed"
  1356.     names(188) = "Yildun"
  1357.     names(189) = "Yundun"
  1358.     names(190) = "Yavyo"
  1359.     names(191) = "Yotrac"
  1360.     names(192) = "Yxzoqu"
  1361.     names(193) = "Ynnot"
  1362.     names(194) = "Zaniah"
  1363.     names(195) = "Zaurak"
  1364.     names(196) = "Zhang"
  1365.     names(197) = "Zibal"
  1366.     names(198) = "Zosma"
  1367.     names(199) = "Zuben"
  1368.  
  1369.  
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #8 on: January 19, 2020, 07:59:15 am »
I think that I fixed another bug but I'm not sure--way past my bedtime. Added a rectangular map and new game. If anyone wants to play on a rectangular map then click "Rectangle" and then click "New Game". gn!
Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57. sw = _DESKTOPWIDTH '                   native video with of syatem
  58. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  59. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  60. nw = 1920
  61.  
  62. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  63.  
  64. shw = sh / 20
  65. shn = sh / 40
  66. nh = 1080
  67.  
  68. tt = 0
  69. lcx = sw
  70. rcx = sw
  71. cp = 100
  72. h = 100
  73. ar = 0
  74. rng = 200
  75. slct = 0
  76. strng = ""
  77. strng0 = ""
  78. strng1 = ""
  79. src = 100
  80. dst = 100
  81. ord.src = 100
  82. ncp = 5
  83. bmp = 2
  84.  
  85. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  86.  
  87.  
  88. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  89. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  90. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  91. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  92.  
  93. StarNames
  94.  
  95. NewGame
  96.  
  97. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  98. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  99. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  100. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  101.  
  102. repeat = 1
  103.  
  104. WHILE repeat
  105.  
  106.     CLS
  107.  
  108.     PaintBackground
  109.  
  110.     PaintStars
  111.  
  112.     PaintFleet
  113.  
  114.     FOR it = 0 TO speed
  115.  
  116.         Update
  117.  
  118.         GetInput
  119.  
  120.         Player
  121.  
  122.         Computer
  123.  
  124.     NEXT
  125.  
  126.     _DISPLAY
  127.  
  128.  
  129.  
  130. SUB Computer
  131.  
  132.     IF paused = 0 THEN
  133.         id = INT(RND * ncp) + bmp
  134.         i = home(id)
  135.         IF star(i).o <> id THEN
  136.             FOR j = 0 TO 99
  137.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  138.             NEXT
  139.         END IF
  140.  
  141.         FOR p = 0 TO 3
  142.  
  143.             IF p = 0 THEN
  144.                 IF star(i).t > LL THEN
  145.                     away = 10000
  146.                     FOR j = 0 TO 99
  147.                         IF star(j).o <> id THEN
  148.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  149.                             IF dist < away THEN
  150.                                 away = dist
  151.                                 o = star(j).o
  152.                             END IF
  153.                         END IF
  154.                     NEXT
  155.                     away1 = 10000
  156.                     away2 = 10000
  157.                     jay1 = 100
  158.                     jay2 = 100
  159.                     FOR j = 0 TO 99
  160.                         IF star(j).o = o THEN
  161.                             IF star(j).d > 0 THEN
  162.                                 star(j).d = star(j).d - 1
  163.                             ELSE
  164.                                 ok = 1
  165.                                 FOR k = 0 TO 99
  166.                                     IF star(k).o = id THEN
  167.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  168.                                         IF dist <= 250 THEN
  169.                                             ok = 1
  170.                                             EXIT FOR
  171.                                         END IF
  172.                                     END IF
  173.                                 NEXT
  174.                                 IF ok = 1 THEN
  175.                                     dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  176.                                     IF dist < away1 THEN
  177.                                         IF away1 < away2 THEN
  178.                                             away2 = away1
  179.                                             jay2 = jay1
  180.                                         END IF
  181.                                         away1 = dist
  182.                                         jay1 = j
  183.                                     ELSE
  184.                                         IF dist < away2 THEN
  185.                                             away2 = dist
  186.                                             jay2 = j
  187.                                         END IF
  188.                                     END IF
  189.                                 END IF
  190.                             END IF
  191.                         END IF
  192.                     NEXT
  193.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  194.                         SendFleet i, jay1, star(i).t / 1.5
  195.                         star(jay1).d = 400
  196.                     ELSE
  197.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  198.                             SendFleet i, jay2, star(i).t / 1.5
  199.                             star(jay2).d = 400
  200.                         END IF
  201.                     END IF
  202.                 END IF
  203.             END IF
  204.  
  205.             IF p = 1 THEN
  206.                 sf2 = 100
  207.                 FOR i = 0 TO 99
  208.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  209.                         sf3 = star(i).t / 2.5
  210.                         FOR j = 0 TO 99
  211.                             IF star(j).d > 0 THEN
  212.                                 star(j).d = star(j).d - 1
  213.                             ELSE
  214.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  215.                                     FOR k = 0 TO 99
  216.                                         IF star(k).o = id THEN
  217.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  218.                                             IF dist <= 250 * ratio THEN
  219.                                                 sf1 = i
  220.                                                 sf2 = j
  221.                                                 EXIT FOR
  222.                                             END IF
  223.                                         END IF
  224.                                     NEXT
  225.                                 END IF
  226.                             END IF
  227.                         NEXT
  228.                         IF sf2 < 100 THEN EXIT FOR
  229.                     END IF
  230.                 NEXT
  231.                 IF sf2 < 100 THEN
  232.                     SendFleet sf1, sf2, sf3
  233.                     star(sf2).d = 400
  234.                     EXIT FOR
  235.                 END IF
  236.             END IF
  237.  
  238.             IF p = 2 THEN
  239.                 FOR i = 0 TO 99
  240.                     IF i <> home(id) AND star(i).o = id THEN
  241.                         IF star(i).t > 49 THEN
  242.                             ok = 1
  243.                             FOR j = 0 TO 99
  244.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  245.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  246.                                     IF dist <= 400 * ratio THEN
  247.                                         ok = 0
  248.                                         EXIT FOR
  249.                                     END IF
  250.                                 END IF
  251.                             NEXT
  252.                             IF ok = 1 THEN
  253.                                 SendFleet i, home(id), star(i).t
  254.                                 EXIT FOR
  255.                             END IF
  256.                         END IF
  257.                     END IF
  258.                 NEXT
  259.                 IF ok = 1 THEN EXIT FOR
  260.             END IF
  261.  
  262.             IF p = 3 THEN
  263.                 ok = 0
  264.                 FOR i = 0 TO 99
  265.                     IF i <> home(id) AND star(i).o = id THEN
  266.                         IF star(i).t > LL * 1.5 + star(i).p * 50 THEN
  267.                             ok = 1
  268.                             EXIT FOR
  269.                         END IF
  270.                     END IF
  271.                 NEXT
  272.                 IF ok = 1 THEN
  273.                     SendFleet i, home(id), star(i).t / 4
  274.                     EXIT FOR
  275.                 END IF
  276.             END IF
  277.  
  278.         NEXT
  279.  
  280.     END IF
  281.  
  282. SUB GamePanel
  283.     x1 = sw / 4
  284.     y1 = sh / 4
  285.     speed = 0
  286.     _DEST gp
  287.     COLOR 0, 8
  288.     CLS
  289.     _FONT ttf72
  290.     n$ = "Beyond The Stars"
  291.     l = _PRINTWIDTH(n$)
  292.     _PRINTSTRING ((960 - l) / 2, 12), n$
  293.     LINE (40, 100)-(920, 100), 0
  294.     COLOR 7, 8
  295.     _FONT ttf36
  296.     _PRINTSTRING (42, 120), "Save"
  297.     _PRINTSTRING (42, 180), "Load"
  298.     COLOR 0, 7
  299.     FOR i = 143 TO 874 STEP 81
  300.         LINE (i, 115)-(i + 39, 158), 7, BF
  301.         LINE (i, 175)-(i + 39, 218), 7, BF
  302.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  303.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  304.     NEXT
  305.     n$ = "Custom Mode"
  306.     c = 7
  307.     IF cm = 1 THEN c = 168
  308.     l2 = 0
  309.     l1 = _PRINTWIDTH(n$)
  310.     LINE (40, 235)-(60 + l1, 295), c, BF
  311.     COLOR 0, c
  312.     _PRINTSTRING (50, 250), n$
  313.     n$ = "Demo Mode"
  314.     c = 7
  315.     IF dm = 1 THEN c = 168
  316.     l2 = l1
  317.     l1 = _PRINTWIDTH(n$)
  318.     LINE (76 + l2, 235)-(96 + l1 + l2, 295), c, BF
  319.     COLOR 0, c
  320.     _PRINTSTRING (86 + l2, 250), n$
  321.     n$ = "Rectangle"
  322.     l2 = l2 + l1
  323.     l1 = _PRINTWIDTH(n$)
  324.     c = 7
  325.     IF rm = 1 THEN c = 168
  326.     LINE (112 + l2, 235)-(132 + l1 + l2, 295), c, BF
  327.     COLOR 0, c
  328.     _PRINTSTRING (122 + l2, 250), n$
  329.     n$ = "New Game"
  330.     l2 = l2 + l1
  331.     l1 = _PRINTWIDTH(n$)
  332.     LINE (148 + l2, 235)-(168 + l1 + l2, 295), 7, BF
  333.     COLOR 0, 7
  334.     _PRINTSTRING (158 + l2, 250), n$
  335.     COLOR 7, 8
  336.     n$ = "Right Click To Cancel"
  337.     l = _PRINTWIDTH(n$)
  338.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  339.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  340.     _DEST 0
  341.  
  342. SUB GetInput
  343.  
  344.     IF ch = CHR$(27) THEN repeat = 0
  345.     IF ch = "n" THEN NewGame
  346.     IF ch = "t" THEN tt = 1 - tt
  347.     IF ch = "p" THEN paused = 1 - paused
  348.     IF ch = "+" THEN
  349.         IF speed < 10 THEN speed = speed + 1
  350.     END IF
  351.     IF ch = "-" THEN
  352.         IF speed > 0 THEN speed = speed - 1
  353.     END IF
  354.     IF ch = "q" THEN QuickSave
  355.     IF ch = "l" THEN QuickRestore
  356.     IF ch = "g" THEN
  357.         gact = 1
  358.         paused = 1
  359.     END IF
  360.     ch = INKEY$
  361.  
  362.  
  363.     lclk = 0
  364.     rclk = 0
  365.  
  366.  
  367.         lmb = _MOUSEBUTTON(1)
  368.         rmb = _MOUSEBUTTON(2)
  369.  
  370.         x = _MOUSEX
  371.  
  372.         IF lmb AND lcx = sw THEN lcx = x
  373.         IF rmb AND rcx = sw THEN rcx = x
  374.  
  375.     WEND
  376.  
  377.     x = _MOUSEX
  378.     y = _MOUSEY
  379.  
  380.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  381.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  382.  
  383.     lcx = sw
  384.     rcx = sw
  385.  
  386.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  387.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  388.             rclk = 0
  389.             oact = 0
  390.             pact = 0
  391.             gact = 0
  392.         ELSE
  393.             i = Identify
  394.             IF i = 100 THEN
  395.                 IF src = 100 THEN
  396.                     paused = 1 - paused
  397.                     ch = ""
  398.                 ELSE
  399.                     src = 100
  400.                 END IF
  401.                 rclk = 0
  402.             END IF
  403.         END IF
  404.     END IF
  405.  
  406.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 AND gact = 0 THEN
  407.         i = Identify
  408.         IF i = 100 THEN
  409.             gact = 1
  410.             lclk = 0
  411.         END IF
  412.     END IF
  413.  
  414.  
  415. FUNCTION Identify
  416.     ii = 100
  417.     FOR i = 0 TO 99
  418.         dx = star(i).x - x
  419.         dy = star(i).y - y
  420.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  421.             ii = i
  422.             EXIT FOR
  423.         END IF
  424.     NEXT
  425.     Identify = ii
  426.  
  427. SUB OrderPanel (i)
  428.     x1 = star(i).x - 420 * ratio
  429.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  430.     x2 = x1 + 400 * ratio
  431.     y1 = star(i).y
  432.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  433.     y2 = y1 + 225 * ratio
  434.     _DEST op
  435.     CLS 0, 8
  436.     COLOR 0, 8
  437.     _FONT ttf72
  438.     n$ = RTRIM$(star(i).n)
  439.     l = _PRINTWIDTH(n$)
  440.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  441.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  442.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  443.     COLOR 7, 8
  444.     _FONT ttf36
  445.     IF box = 0 THEN
  446.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  447.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  448.         LINE (xo, yo)-(xd, yd), 7, BF
  449.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  450.         LINE (xo, yo)-(xd, yd), 7, BF
  451.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  452.         LINE (xo, yo)-(xd, yd), 7, BF
  453.         n$ = RTRIM$(strng0)
  454.         COLOR 0, 7
  455.         _FONT ttf24
  456.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  457.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  458.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  459.     END IF
  460.     IF box = 1 THEN
  461.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  462.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  463.         LINE (xo, yo)-(xd, yd), 7, BF
  464.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  465.         LINE (xo, yo)-(xd, yd), 7, BF
  466.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  467.         LINE (xo, yo)-(xd, yd), 7, BF
  468.         n$ = RTRIM$(strng1)
  469.         COLOR 0, 7
  470.         _FONT ttf24
  471.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  472.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  473.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  474.     END IF
  475.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  476.     _DEST 0
  477.     oanx = x1: oany = y1
  478.  
  479. SUB PaintBackground
  480.     x = RND * sw
  481.     y = RND * sh
  482.     c = RND * 14 + 1
  483.     PSET (x, y), c
  484.     RANDOMIZE USING seed
  485.     FOR i = 1 TO 600 * ratio
  486.         x = RND * sw
  487.         y = RND * sh
  488.         c = RND * 14 + 1
  489.         PSET (x, y), c
  490.     NEXT
  491.  
  492. SUB PaintFleet
  493.     count = fltcnt
  494.     i = 0
  495.     WHILE count
  496.         IF fleet(i).o <> 0 THEN
  497.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  498.             count = count - 1
  499.         END IF
  500.         i = i + 1
  501.     WEND
  502.  
  503. SUB PaintStars
  504.  
  505.     'execute standing orders
  506.     FOR i = 0 TO 99
  507.         IF order(i).src <> 100 THEN
  508.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  509.                 order(i).src = 100
  510.             ELSE
  511.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  512.                 IF star(i).t >= order(i).ovr THEN
  513.                     SendFleet order(i).src, order(i).dst, order(i).shp
  514.                 END IF
  515.             END IF
  516.         END IF
  517.     NEXT
  518.  
  519.     FOR i = 0 TO 99
  520.         c = star(i).c
  521.         x = star(i).x
  522.         y = star(i).y
  523.         o = star(i).o
  524.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  525.         COLOR 15
  526.         IF o > 0 THEN
  527.             PAINT (x, y), o + 8, c
  528.         END IF
  529.         _FONT ttf16
  530.         IF tt THEN
  531.             n$ = star(i).n
  532.             n$ = RTRIM$(n$)
  533.             l = _PRINTWIDTH(n$)
  534.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  535.         ELSE
  536.             n$ = STR$(star(i).t)
  537.             l = _PRINTWIDTH(n$)
  538.         END IF
  539.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  540.     NEXT
  541.  
  542.  
  543. SUB Player
  544.  
  545.     ' Custom Map Mode
  546.     IF cm = 1 THEN
  547.         IF lmb THEN
  548.             i = Identify
  549.             IF i < 100 THEN
  550.                 WHILE _MOUSEINPUT: WEND
  551.                 nx = _MOUSEX
  552.                 ny = _MOUSEY
  553.                 ok = 1
  554.                 FOR j = 0 TO 99
  555.                     IF j <> i THEN
  556.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  557.                         IF dist <= 60 THEN
  558.                             ok = 0
  559.                             EXIT FOR
  560.                         END IF
  561.                     END IF
  562.                 NEXT
  563.                 IF ok = 1 THEN
  564.                     star(i).x = nx
  565.                     star(i).y = ny
  566.                 ELSE
  567.                     _MOUSEMOVE star(i).x, star(i).y
  568.                 END IF
  569.             END IF
  570.         END IF
  571.     END IF
  572.  
  573.     'Add new order to standing orders
  574.     IF ord.src <> 100 THEN
  575.         i = ord.src
  576.         IF ord.shp = 0 THEN
  577.             order(i).src = 100
  578.         ELSE
  579.             order(i) = ord
  580.         END IF
  581.         src = 100
  582.         ord.src = 100
  583.     END IF
  584.  
  585.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  586.  
  587.         'If there is no source star see if we can get one
  588.         IF src = 100 AND cm = 0 THEN
  589.             i = Identify
  590.             IF i < 100 THEN WorldPanel i
  591.             IF lclk = 1 OR rclk = 1 THEN
  592.                 lclk = 0
  593.                 rclk = 0
  594.                 src = i
  595.             END IF
  596.         END IF
  597.  
  598.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  599.         IF src <> 100 THEN
  600.             c = 12
  601.             FOR i = 0 TO 99
  602.                 IF star(i).o = 1 THEN
  603.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  604.                     IF dist <= 251 * ratio THEN
  605.                         c = 10
  606.                         EXIT FOR
  607.                     END IF
  608.                 END IF
  609.             NEXT
  610.             i = Identify
  611.             IF i <> 100 THEN
  612.                 x = star(i).x
  613.                 y = star(i).y
  614.             END IF
  615.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  616.             LINE (star(src).x, star(src).y)-(x, y), c
  617.             n$ = STR$(INT(rang))
  618.             _FONT ttf16
  619.             _PRINTSTRING (x + 20, y), n$, 0
  620.         END IF
  621.  
  622.         'If we have a source star see if we clicked on a destination star
  623.         IF src <> 100 THEN
  624.             IF lclk = 1 OR rclk = 1 THEN
  625.                 i = Identify
  626.                 IF i = src THEN
  627.                     lclk = 0
  628.                     src = 100
  629.                     IF rclk = 1 THEN
  630.                         rclk = 0
  631.                         order(i).src = 100
  632.                     END IF
  633.                 ELSE
  634.                     IF i < 100 AND i <> src THEN
  635.                         IF lclk = 1 THEN
  636.                             lclk = 0
  637.                             FOR j = 0 TO 99
  638.                                 IF star(j).o = 1 THEN
  639.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  640.                                     IF dist <= 250 THEN
  641.                                         dst = i
  642.                                         pact = 1
  643.                                         EXIT FOR
  644.                                     END IF
  645.                                 END IF
  646.                             NEXT
  647.                         ELSE
  648.                             rclk = 0
  649.                             dst = i
  650.                             IF star(i).o = 1 THEN
  651.                                 oact = 1
  652.                             END IF
  653.                         END IF
  654.                     END IF
  655.                 END IF
  656.             END IF
  657.         END IF
  658.     END IF
  659.  
  660.     'If the game panel is active
  661.     IF gact = 1 THEN
  662.         GamePanel
  663.         IF lclk = 1 THEN
  664.             FOR i = 143 TO 874 STEP 81
  665.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  666.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  667.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  668.                     SaveGame n$
  669.                 END IF
  670.                 y1 = y1 + 60: y2 = y2 + 60
  671.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  672.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  673.                     LoadGame n$
  674.                 END IF
  675.             NEXT
  676.             _FONT ttf36
  677.             l2 = 0
  678.             l1 = _PRINTWIDTH("Custom Mode")
  679.             IF fltcnt = 0 THEN
  680.                 x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  681.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  682.                     cm = 1 - cm
  683.                 END IF
  684.             END IF
  685.             l2 = l1
  686.             l1 = _PRINTWIDTH("Demo Mode")
  687.             x1 = 76 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  688.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  689.                 dm = 1 - dm
  690.                 IF dm = 0 THEN
  691.                     ncp = 5
  692.                     bmp = 2
  693.                 ELSE
  694.                     ncp = 6
  695.                     bmp = 1
  696.                 END IF
  697.             END IF
  698.             l2 = l2 + l1
  699.             l1 = _PRINTWIDTH("Rectangle")
  700.             x1 = 112 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  701.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  702.                 rm = 1 - rm
  703.             END IF
  704.             l2 = l2 + l1
  705.             l1 = _PRINTWIDTH("New Game")
  706.             x1 = 148 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  707.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  708.                 gact = 0
  709.                 NewGame
  710.             END IF
  711.         END IF
  712.     END IF
  713.  
  714.     'If the star standing orders panel is active
  715.     IF oact = 1 THEN
  716.  
  717.         IF star(src).o = 1 THEN
  718.             OrderPanel dst
  719.         END IF
  720.  
  721.         IF rclk = 1 THEN oact = 0
  722.  
  723.         IF box = 0 THEN
  724.             tmp$ = RTRIM$(strng0)
  725.         ELSE
  726.             tmp$ = RTRIM$(strng1)
  727.         END IF
  728.  
  729.         IF lclk = 1 THEN
  730.  
  731.             x1 = oanx: x2 = oanx + 400 * ratio
  732.             y1 = oany: y2 = oany + 540 * ratio
  733.  
  734.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  735.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  736.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  737.                     IF box = 0 THEN
  738.                         n$ = RTRIM$(strng0)
  739.                         l = LEN(n$)
  740.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  741.                     ELSE
  742.                         n$ = RTRIM$(strng1)
  743.                         l = LEN(n$)
  744.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  745.                     END IF
  746.                 END IF
  747.             END IF
  748.  
  749.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  750.  
  751.                 IF box = 0 THEN
  752.  
  753.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  754.                         ord.ovr = INT(VAL(strng0))
  755.                         box = 1
  756.                     END IF
  757.  
  758.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  759.                         strng0 = ""
  760.                     END IF
  761.  
  762.                 ELSE
  763.  
  764.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  765.                         IF INT(VAL(strng1)) > ord.ovr THEN
  766.                             strng1 = ""
  767.                         ELSE
  768.                             box = 0
  769.                             oact = 0
  770.                             ord.src = src
  771.                             ord.dst = dst
  772.                             ord.shp = VAL(strng1)
  773.                             strng0 = ""
  774.                             strng1 = ""
  775.                         END IF
  776.                     END IF
  777.  
  778.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  779.                         strng0 = ""
  780.                         strng1 = ""
  781.                         box = 0
  782.                     END IF
  783.  
  784.                 END IF
  785.  
  786.             END IF
  787.         END IF
  788.         x1 = 10000: y1 = 10000
  789.  
  790.     END IF
  791.  
  792.  
  793.     'If the fleet send panel is active
  794.     IF pact = 1 THEN
  795.         IF rclk = 1 THEN pact = 0
  796.         IF star(src).o = 1 THEN
  797.             ShowPanel dst
  798.         END IF
  799.         IF lclk = 1 THEN
  800.             tmp$ = RTRIM$(strng)
  801.  
  802.             x1 = panx: x2 = panx + 400 * ratio
  803.             y1 = pany: y2 = pany + 540 * ratio
  804.  
  805.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  806.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  807.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  808.                     strng = tmp$ + STR$(dig)
  809.                 END IF
  810.             END IF
  811.  
  812.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  813.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  814.                     pact = 0
  815.                     value = star(src).t
  816.                     SendFleet src, dst, value
  817.                     src = 100
  818.                 END IF
  819.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  820.                     pact = 0
  821.                     value = star(src).t / 2
  822.                     SendFleet src, dst, value
  823.                     src = 100
  824.                 END IF
  825.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  826.                     pact = 0
  827.                     value = star(src).t / 3
  828.                     SendFleet src, dst, value
  829.                     src = 100
  830.                 END IF
  831.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  832.                     strng = ""
  833.                 END IF
  834.             END IF
  835.  
  836.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  837.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  838.                     value = VAL(strng)
  839.                     strng = ""
  840.                     pact = 0
  841.                     IF value <= star(src).t AND star(src).t <> o THEN
  842.                         SendFleet src, dst, value
  843.                     END IF
  844.                     src = 100
  845.                 END IF
  846.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  847.                     pact = 0
  848.                     src = 100
  849.                     strng = ""
  850.                 END IF
  851.             END IF
  852.         END IF
  853.     END IF
  854.  
  855. SUB QuickSave
  856.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  857.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  858.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  859.     qfltcnt = fltcnt
  860.     qLL = LL
  861.  
  862. SUB QuickRestore
  863.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  864.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  865.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  866.     fltcnt = qfltcnt
  867.     LL = qLL
  868.     paused = 1
  869.  
  870. SUB LoadGame (n$)
  871.     n$ = n$ + ".sav"
  872.     IF _FILEEXISTS(n$) THEN
  873.         OPEN n$ FOR BINARY AS #2
  874.         GET #2, , star()
  875.         GET #2, , order()
  876.         GET #2, , fleet()
  877.         GET #2, , home()
  878.         GET #2, , fltcnt
  879.         GET #2, , LL
  880.         CLOSE #2
  881.         PRINT "Game Loaded"
  882.         dm = 0
  883.         cm = 0
  884.         ncp = 5
  885.         bmp = 2
  886.         it = 0
  887.     END IF
  888.  
  889. SUB SaveGame (n$)
  890.     n$ = n$ + ".sav"
  891.     OPEN n$ FOR BINARY AS #1
  892.     CLOSE #1
  893.     KILL n$
  894.     OPEN n$ FOR BINARY AS #1
  895.     PUT #1, , star()
  896.     PUT #1, , order()
  897.     PUT #1, , fleet()
  898.     PUT #1, , home()
  899.     PUT #1, , fltcnt
  900.     PUT #1, , LL
  901.     CLOSE #1
  902.     PRINT "Game Saved"
  903.  
  904. SUB SendFleet (src, dst, ships)
  905.     IF fltcnt < 2000 THEN
  906.         FOR i = 0 TO 1999
  907.             IF fleet(i).o = 0 THEN
  908.                 fleet(i).o = star(src).o
  909.                 fleet(i).d = dst
  910.                 fleet(i).x1 = star(src).x
  911.                 fleet(i).y1 = star(src).y
  912.                 fleet(i).x2 = star(dst).x
  913.                 fleet(i).y2 = star(dst).y
  914.                 fleet(i).t = ships
  915.                 star(src).t = star(src).t - ships
  916.                 fltcnt = fltcnt + 1
  917.                 EXIT FOR
  918.             END IF
  919.         NEXT
  920.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  921.     END IF
  922.  
  923. SUB ShowPanel (i)
  924.     x1 = star(i).x - 420 * ratio
  925.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  926.     x2 = x1 + 400 * ratio
  927.     y1 = star(i).y
  928.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  929.     y2 = y1 + 540 * ratio
  930.     _DEST sp
  931.     CLS 0, 8
  932.     COLOR 0, 8
  933.     _FONT ttf72
  934.     n$ = RTRIM$(star(src).n)
  935.     l = _PRINTWIDTH(n$)
  936.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  937.     n$ = "to"
  938.     l = _PRINTWIDTH(n$)
  939.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  940.     n$ = RTRIM$(star(dst).n)
  941.     l = _PRINTWIDTH(n$)
  942.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  943.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  944.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  945.     n$ = RTRIM$(strng)
  946.     l = _PRINTWIDTH(n$)
  947.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  948.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  949.     LINE (xo, yo)-(xd, yd), 7, BF
  950.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  951.     LINE (xo, yo)-(xd, yd), 7, BF
  952.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  953.     LINE (xo, yo)-(xd, yd), 7, BF
  954.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  955.     LINE (xo, yo)-(xd, yd), 7, BF
  956.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  957.     LINE (xo, yo)-(xd, yd), 7, BF
  958.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  959.     LINE (xo, yo)-(xd, yd), 7, BF
  960.     _FONT ttf24
  961.     COLOR 7, 8
  962.     n$ = RTRIM$(STR$(star(src).t))
  963.     l = _PRINTWIDTH(n$)
  964.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  965.     n$ = RTRIM$(STR$(star(dst).t))
  966.     l = _PRINTWIDTH(n$)
  967.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  968.     _FONT ttf16
  969.     COLOR 0, 7
  970.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  971.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  972.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  973.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  974.     _FONT ttf72
  975.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  976.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  977.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  978.     panx = x1: pany = y1
  979.     _DEST 0
  980.  
  981. SUB Update
  982.     IF paused = 0 THEN
  983.         RANDOMIZE TIMER
  984.         FOR i = 0 TO 99
  985.             r = INT(RND * 60)
  986.             IF r < star(i).p THEN
  987.                 IF star(i).o > 0 THEN
  988.                     star(i).t = star(i).t + 1
  989.                 ELSE
  990.                     IF INT(RND * 10) < 3 THEN
  991.                         star(i).t = star(i).t + 1
  992.                     END IF
  993.                 END IF
  994.             END IF
  995.         NEXT
  996.  
  997.         count = fltcnt
  998.         i = 0
  999.         WHILE count
  1000.             IF fleet(i).o <> 0 THEN
  1001.                 count = count - 1
  1002.                 IF fleet(i).x2 > fleet(i).x1 THEN
  1003.                     fleet(i).x1 = fleet(i).x1 + 1
  1004.                 END IF
  1005.                 IF fleet(i).x2 < fleet(i).x1 THEN
  1006.                     fleet(i).x1 = fleet(i).x1 - 1
  1007.                 END IF
  1008.                 IF fleet(i).y2 > fleet(i).y1 THEN
  1009.                     fleet(i).y1 = fleet(i).y1 + 1
  1010.                 END IF
  1011.                 IF fleet(i).y2 < fleet(i).y1 THEN
  1012.                     fleet(i).y1 = fleet(i).y1 - 1
  1013.                 END IF
  1014.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  1015.                     dest = fleet(i).d
  1016.                     IF star(dest).o = fleet(i).o THEN
  1017.                         star(dest).t = star(dest).t + fleet(i).t
  1018.                         fleet(i).o = 0
  1019.                         fltcnt = fltcnt - 1
  1020.                     ELSE
  1021.                         o = star(dest).o
  1022.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  1023.                             k = 100
  1024.                             shortest = 10000
  1025.                             FOR j = 0 TO 99
  1026.                                 IF star(j).o = o THEN
  1027.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  1028.                                     IF dist < shortest THEN
  1029.                                         shortest = dist
  1030.                                         k = j
  1031.                                     END IF
  1032.                                 END IF
  1033.                             NEXT
  1034.                             SendFleet dest, k, star(dest).t * 0.90
  1035.                             star(dest).t = 0
  1036.                             star(dest).o = fleet(i).o
  1037.                             star(dest).t = fleet(i).t
  1038.                             star(dest).o = fleet(i).o
  1039.                             fleet(i).o = 0
  1040.                             fltcnt = fltcnt - 1
  1041.                         ELSE
  1042.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  1043.                                 alive = 1
  1044.                                 WHILE alive
  1045.                                     alive = 0
  1046.                                     damorg = fleet(i).t / 10 + 1
  1047.                                     damdst = star(dest).t / 8 + 1
  1048.                                     fleet(i).t = fleet(i).t - damdst
  1049.                                     star(dest).t = star(dest).t - damorg
  1050.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  1051.                                         alive = 1
  1052.                                     END IF
  1053.                                 WEND
  1054.                                 IF star(dest).t < 1 THEN
  1055.                                     star(dest).t = fleet(i).t
  1056.                                     star(dest).o = fleet(i).o
  1057.                                 END IF
  1058.                                 fleet(i).o = 0
  1059.                                 fltcnt = fltcnt - 1
  1060.                             ELSE
  1061.                                 k = 100
  1062.                                 shortest = 10000
  1063.                                 FOR j = 0 TO 99
  1064.                                     IF star(j).o = fleet(i).o THEN
  1065.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1066.                                         IF dist < shortest THEN
  1067.                                             shortest = dist
  1068.                                             k = j
  1069.                                         END IF
  1070.                                     END IF
  1071.                                 NEXT
  1072.                                 IF k < 100 THEN
  1073.                                     fleet(i).x2 = star(k).x
  1074.                                     fleet(i).y2 = star(k).y
  1075.                                     fleet(i).d = k
  1076.                                 ELSE
  1077.                                     fleet(i).o = 0
  1078.                                     fltcnt = fltcnt - 1
  1079.                                 END IF
  1080.                             END IF
  1081.                         END IF
  1082.                     END IF
  1083.                 END IF
  1084.             END IF
  1085.             i = i + 1
  1086.         WEND
  1087.     END IF
  1088.  
  1089. SUB WorldPanel (i)
  1090.     x1 = star(i).x - 420 * ratio
  1091.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1092.     x2 = x1 + 400 * ratio
  1093.     y1 = star(i).y
  1094.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1095.     y2 = y1 + 225 * ratio
  1096.     _DEST wp
  1097.     CLS 0, 8
  1098.     COLOR 0, 8
  1099.     _FONT ttf72
  1100.     n$ = RTRIM$(star(i).n)
  1101.     l = _PRINTWIDTH(n$)
  1102.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1103.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1104.     COLOR 7, 8
  1105.     _FONT ttf36
  1106.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1107.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1108.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1109.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1110.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1111.     n$ = "NO"
  1112.     FOR j = 0 TO 99
  1113.         IF star(i).o <> star(j).o THEN
  1114.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1115.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1116.                 IF dist <= 250 THEN
  1117.                     n$ = "YES"
  1118.                     EXIT FOR
  1119.                 END IF
  1120.             END IF
  1121.         END IF
  1122.     NEXT
  1123.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1124.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1125.     _DEST 0
  1126.  
  1127. SUB NewGame
  1128.     DIM k AS INTEGER
  1129.     DIM r AS INTEGER
  1130.     DIM dx AS INTEGER
  1131.     DIM dy AS INTEGER
  1132.     DIM n AS STRING * 10
  1133.     paused = 1
  1134.     FOR i = 0 TO 999
  1135.         fleet(i).o = 0
  1136.     NEXT
  1137.     slct = 0
  1138.     fltcnt = 0
  1139.     LL = 0
  1140.     seed = RND * 1000
  1141.     FOR i = 0 TO 99
  1142.         k = 1
  1143.         WHILE k
  1144.             k = 0
  1145.             ok = 0
  1146.             DO
  1147.                 x = RND * (sw - sww) + swn
  1148.                 y = RND * (sh - shw) + shn
  1149.                 ok = -1
  1150.                 IF rm = 1 AND x > sw / 4 AND x < sw - sw / 4 AND y > sh / 4 AND y < sh - sh / 4 THEN ok = 0
  1151.             LOOP UNTIL ok
  1152.             r = INT(RND * 200)
  1153.             n = names(r)
  1154.             FOR j = 0 TO i - 1
  1155.                 dx = x - star(j).x
  1156.                 dy = y - star(j).y
  1157.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1158.                     k = 1
  1159.                 END IF
  1160.                 IF n = star(j).n THEN
  1161.                     k = 1
  1162.                 END IF
  1163.             NEXT
  1164.         WEND
  1165.         star(i).n = n
  1166.         star(i).x = x
  1167.         star(i).y = y
  1168.         star(i).c = RND * 6 + 9
  1169.         star(i).s = RND * 5
  1170.         star(i).o = 0
  1171.         star(i).p = star(i).s + (RND * 5) + 3
  1172.         star(i).t = 0
  1173.         order(i).src = 100
  1174.     NEXT
  1175.     FOR i = 1 TO 6
  1176.         ok = 0
  1177.         WHILE (ok < 1)
  1178.             ok = 1
  1179.             j = RND * 100
  1180.             FOR k = 1 TO i - 1
  1181.                 dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1182.                 IF dist < 500 * ratio THEN
  1183.                     ok = 0
  1184.                     EXIT FOR
  1185.                 END IF
  1186.             NEXT
  1187.             IF ok = 1 THEN
  1188.                 ok = -1
  1189.                 FOR k = 0 TO 99
  1190.                     dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1191.                     IF dist <= 200 THEN ok = ok + 1
  1192.                     IF ok = 2 THEN EXIT FOR
  1193.                 NEXT
  1194.             END IF
  1195.         WEND
  1196.         home(i) = j
  1197.         star(j).o = i
  1198.         star(j).p = 10
  1199.         star(j).t = 100
  1200.         star(j).s = 4
  1201.     NEXT
  1202.     star(home(1)).n = "Sol"
  1203.     star(home(1)).c = 14
  1204.     ncp = 5
  1205.     bmp = 2
  1206.     dm = 0
  1207.     speed = 0
  1208.     QuickSave
  1209.  
  1210. ' A lot of star names I made up
  1211.  
  1212. SUB StarNames
  1213.     names(0) = "Acamar"
  1214.     names(1) = "Arcab"
  1215.     names(2) = "Acrux"
  1216.     names(3) = "Adhara"
  1217.     names(4) = "Arneb"
  1218.     names(5) = "Antares"
  1219.     names(6) = "Arcturus"
  1220.     names(7) = "Atria"
  1221.     names(8) = "Beid"
  1222.     names(9) = "Betelgeuse"
  1223.     names(10) = "Botein"
  1224.     names(11) = "Beemim"
  1225.     names(12) = "Bellatrix"
  1226.     names(13) = "Bharani"
  1227.     names(14) = "Biham"
  1228.     names(15) = "Brachium"
  1229.     names(16) = "Canopus"
  1230.     names(17) = "Capella"
  1231.     names(18) = "Castor"
  1232.     names(19) = "Chara"
  1233.     names(20) = "Cursa"
  1234.     names(21) = "Copernicus"
  1235.     names(22) = "Chalawan"
  1236.     names(23) = "Chertan"
  1237.     names(24) = "Dabih"
  1238.     names(25) = "Dalim"
  1239.     names(26) = "Deneb"
  1240.     names(27) = "Denebola"
  1241.     names(28) = "Diadem"
  1242.     names(29) = "Diphda"
  1243.     names(30) = "Dschubba"
  1244.     names(31) = "Dziban"
  1245.     names(32) = "Edasich"
  1246.     names(33) = "Electra"
  1247.     names(34) = "Elgafar"
  1248.     names(35) = "Elkurud"
  1249.     names(36) = "Elnath"
  1250.     names(37) = "Eltanin"
  1251.     names(38) = "Enif"
  1252.     names(39) = "Errai"
  1253.     names(40) = "Fafnir"
  1254.     names(41) = "Fang"
  1255.     names(42) = "Fawaris"
  1256.     names(43) = "Felis"
  1257.     names(44) = "Fomalhaut"
  1258.     names(45) = "Fulu"
  1259.     names(46) = "Fumal"
  1260.     names(47) = "Furud"
  1261.     names(48) = "Garnet"
  1262.     names(49) = "Giausar"
  1263.     names(50) = "Gienah"
  1264.     names(51) = "Ginan"
  1265.     names(52) = "Gomeisa"
  1266.     names(53) = "Graffias"
  1267.     names(54) = "Grumium"
  1268.     names(55) = "Gudja"
  1269.     names(56) = "Hadar"
  1270.     names(57) = "Haedus"
  1271.     names(58) = "Hamal"
  1272.     names(59) = "Hassaleh"
  1273.     names(60) = "Hatysa"
  1274.     names(61) = "Helvetios"
  1275.     names(62) = "Heze"
  1276.     names(63) = "Homan"
  1277.     names(64) = "Iklil"
  1278.     names(65) = "Imai"
  1279.     names(66) = "Intercrus"
  1280.     names(67) = "Izar"
  1281.     names(68) = "Iccar"
  1282.     names(69) = "Inar"
  1283.     names(70) = "Iaeth"
  1284.     names(71) = "Imaous"
  1285.     names(72) = "Jabbah"
  1286.     names(73) = "Jishui"
  1287.     names(74) = "Jax"
  1288.     names(75) = "Jalae"
  1289.     names(76) = "Jewel"
  1290.     names(77) = "Jumbo"
  1291.     names(78) = "Jerue"
  1292.     names(79) = "Jabear"
  1293.     names(80) = "Kakkab"
  1294.     names(81) = "Kang"
  1295.     names(82) = "Kekouan"
  1296.     names(83) = "Keid"
  1297.     names(84) = "Kitalpha"
  1298.     names(85) = "Kochab"
  1299.     names(86) = "Kolob"
  1300.     names(87) = "Kobol"
  1301.     names(88) = "Larawag"
  1302.     names(89) = "Lesath"
  1303.     names(90) = "Libertas"
  1304.     names(91) = "Lich"
  1305.     names(92) = "Lilly"
  1306.     names(93) = "Laddel"
  1307.     names(94) = "Luminous"
  1308.     names(95) = "Lasacious"
  1309.     names(96) = "Mizar"
  1310.     names(97) = "Markab"
  1311.     names(98) = "Matar"
  1312.     names(99) = "Mintaka"
  1313.     names(100) = "Meleph"
  1314.     names(101) = "Menkar"
  1315.     names(102) = "Merga"
  1316.     names(103) = "Merope"
  1317.     names(104) = "Nahn"
  1318.     names(105) = "Naos"
  1319.     names(106) = "Nashira"
  1320.     names(107) = "Navi"
  1321.     names(108) = "Nekkar"
  1322.     names(109) = "Nembus"
  1323.     names(110) = "Nihal"
  1324.     names(111) = "Nunki"
  1325.     names(112) = "Ogma"
  1326.     names(113) = "Okab"
  1327.     names(114) = "Ohmy"
  1328.     names(115) = "Oragami"
  1329.     names(116) = "Origen"
  1330.     names(117) = "Omanii"
  1331.     names(118) = "Obytewa"
  1332.     names(119) = "Oglok"
  1333.     names(120) = "Phact"
  1334.     names(121) = "Pherkad"
  1335.     names(122) = "Pleione"
  1336.     names(122) = "Polaris"
  1337.     names(123) = "Pollux"
  1338.     names(124) = "Procyon"
  1339.     names(125) = "Proxima"
  1340.     names(126) = "Polis"
  1341.     names(127) = "Quaint"
  1342.     names(128) = "QB64"
  1343.     names(129) = "Quetzal"
  1344.     names(130) = "Qussol"
  1345.     names(131) = "Quella"
  1346.     names(132) = "Quyaeo"
  1347.     names(133) = "Ququdas"
  1348.     names(134) = "Quekak"
  1349.     names(135) = "Rasalas"
  1350.     names(136) = "Regor"
  1351.     names(137) = "Regulus"
  1352.     names(138) = "Rigel"
  1353.     names(139) = "Revati"
  1354.     names(140) = "Rotenev"
  1355.     names(141) = "Rukbat"
  1356.     names(142) = "Rastaban"
  1357.     names(143) = "Sabik"
  1358.     names(144) = "Sadr"
  1359.     names(145) = "Saiph"
  1360.     names(146) = "Sargas"
  1361.     names(147) = "Sarin"
  1362.     names(148) = "Syrma"
  1363.     names(149) = "Spica"
  1364.     names(150) = "Sirius"
  1365.     names(151) = "Tarazed"
  1366.     names(152) = "Taygeta"
  1367.     names(153) = "Tejat"
  1368.     names(154) = "Thabit"
  1369.     names(155) = "Thuban"
  1370.     names(156) = "Tiaki"
  1371.     names(157) = "Toliman"
  1372.     names(158) = "Torcular"
  1373.     names(157) = "Umala"
  1374.     names(158) = "Ulatte"
  1375.     names(159) = "Ubbessa"
  1376.     names(160) = "Unoless"
  1377.     names(161) = "Umaddem"
  1378.     names(162) = "Ummbra"
  1379.     names(162) = "Uniqu"
  1380.     names(163) = "Uzzaal"
  1381.     names(164) = "Vega"
  1382.     names(165) = "Veritate"
  1383.     names(166) = "Vindetrix"
  1384.     names(167) = "Vedas"
  1385.     names(168) = "Vergg"
  1386.     names(169) = "Vacant"
  1387.     names(170) = "Vucae"
  1388.     names(171) = "Vicar"
  1389.     names(172) = "Wasat"
  1390.     names(173) = "Wazn"
  1391.     names(174) = "Wezen"
  1392.     names(175) = "Waiten"
  1393.     names(176) = "Wachar"
  1394.     names(177) = "Wheelz"
  1395.     names(178) = "Whatsp"
  1396.     names(179) = "Wassand"
  1397.     names(180) = "Xenno"
  1398.     names(181) = "Xyphod"
  1399.     names(182) = "Xu"
  1400.     names(183) = "Xaal"
  1401.     names(184) = "Xyross"
  1402.     names(185) = "Xiggot"
  1403.     names(186) = "Xirrks"
  1404.     names(187) = "Yed"
  1405.     names(188) = "Yildun"
  1406.     names(189) = "Yundun"
  1407.     names(190) = "Yavyo"
  1408.     names(191) = "Yotrac"
  1409.     names(192) = "Yxzoqu"
  1410.     names(193) = "Ynnot"
  1411.     names(194) = "Zaniah"
  1412.     names(195) = "Zaurak"
  1413.     names(196) = "Zhang"
  1414.     names(197) = "Zibal"
  1415.     names(198) = "Zosma"
  1416.     names(199) = "Zuben"
  1417.  
My name is Michael, but you can call me Mike :)

Offline Aurel

  • Forum Regular
  • Posts: 167
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #9 on: January 20, 2020, 07:30:38 am »
Program is interesting,but i don't get it how to play...stupid me
Anyway i don't know why qb64 need 1 minute to compile 53kB program on my dual-core pentium computer
win7 ultimatePro 32 bit ?

I use my own editor but i am forced to use qb ide to compile and run program.
must be something with unknown command line ???
//////////////////////////////////////////////////////////////////
https://aurelsoft.ucoz.com
https://www.facebook.com/groups/470369984111370
//////////////////////////////////////////////////////////////////

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #10 on: January 20, 2020, 01:01:51 pm »
Program is interesting,but i don't get it how to play...stupid me
Anyway i don't know why qb64 need 1 minute to compile 53kB program on my dual-core pentium computer
win7 ultimatePro 32 bit ?

I use my own editor but i am forced to use qb ide to compile and run program.
must be something with unknown command line ???
"i don't get it how to play"
That is more my deficiency for not explaining that well enough. The human is the color blue. The human player's home star is Sol. Sol starts off with 100 ships as do the computer players on their home worlds. The player can send ships from one of their stars to another star by clicking on one of their stars and then left clicking on any star within range. The goal is to capture other stars until the player has conquered all 100 stars. I hope that you will give it another try. :)  

My name is Michael, but you can call me Mike :)

Offline Aurel

  • Forum Regular
  • Posts: 167
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #11 on: January 20, 2020, 03:06:33 pm »
well OK ,,i will try again
//////////////////////////////////////////////////////////////////
https://aurelsoft.ucoz.com
https://www.facebook.com/groups/470369984111370
//////////////////////////////////////////////////////////////////

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #12 on: January 21, 2020, 05:52:01 am »
Added Play a Duel to the game menu. One human, one computer in opposite corners go after each other. I thought it was worth an update. 

Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56.  
  57. sw = _DESKTOPWIDTH '                   native video with of syatem
  58. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  59. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  60. nw = 1920
  61.  
  62. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  63.  
  64. shw = sh / 20
  65. shn = sh / 40
  66. nh = 1080
  67.  
  68. tt = 0
  69. lcx = sw
  70. rcx = sw
  71. cp = 100
  72. h = 100
  73. ar = 0
  74. rng = 200
  75. slct = 0
  76. strng = ""
  77. strng0 = ""
  78. strng1 = ""
  79. src = 100
  80. dst = 100
  81. ord.src = 100
  82. ncp = 5
  83. bmp = 2
  84.  
  85. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  86.  
  87.  
  88. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  89. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  90. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  91. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  92.  
  93. StarNames
  94.  
  95. NewGame
  96.  
  97. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  98. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  99. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  100. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  101.  
  102. repeat = 1
  103.  
  104. WHILE repeat
  105.  
  106.     CLS
  107.  
  108.     PaintBackground
  109.  
  110.     PaintStars
  111.  
  112.     PaintFleet
  113.  
  114.     FOR it = 0 TO speed
  115.  
  116.         Update
  117.  
  118.         GetInput
  119.  
  120.         Player
  121.  
  122.         Computer
  123.  
  124.     NEXT
  125.  
  126.     _DISPLAY
  127.  
  128.  
  129.  
  130. SUB Computer
  131.  
  132.     IF paused = 0 THEN
  133.         IF duel = 1 THEN id = 2 ELSE id = INT(RND * ncp) + bmp
  134.         i = home(id)
  135.         IF star(i).o <> id THEN
  136.             FOR j = 0 TO 99
  137.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  138.             NEXT
  139.         END IF
  140.  
  141.         FOR p = 0 TO 3
  142.  
  143.             IF p = 0 THEN
  144.                 IF star(i).t > LL THEN
  145.                     away = 10000
  146.                     FOR j = 0 TO 99
  147.                         IF star(j).o <> id THEN
  148.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  149.                             IF dist < away THEN
  150.                                 away = dist
  151.                                 o = star(j).o
  152.                             END IF
  153.                         END IF
  154.                     NEXT
  155.                     away1 = 10000
  156.                     away2 = 10000
  157.                     jay1 = 100
  158.                     jay2 = 100
  159.                     FOR j = 0 TO 99
  160.                         IF star(j).o = o THEN
  161.                             IF star(j).d > 0 THEN
  162.                                 star(j).d = star(j).d - 1
  163.                             ELSE
  164.                                 ok = 0
  165.                                 FOR k = 0 TO 99
  166.                                     IF star(k).o = id THEN
  167.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  168.                                         IF dist <= 250 THEN
  169.                                             ok = 1
  170.                                             EXIT FOR
  171.                                         END IF
  172.                                     END IF
  173.                                 NEXT
  174.                                 IF ok = 1 THEN
  175.                                     dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  176.                                     IF dist < away1 THEN
  177.                                         IF away1 < away2 THEN
  178.                                             away2 = away1
  179.                                             jay2 = jay1
  180.                                         END IF
  181.                                         away1 = dist
  182.                                         jay1 = j
  183.                                     ELSE
  184.                                         IF dist < away2 THEN
  185.                                             away2 = dist
  186.                                             jay2 = j
  187.                                         END IF
  188.                                     END IF
  189.                                 END IF
  190.                             END IF
  191.                         END IF
  192.                     NEXT
  193.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  194.                         SendFleet i, jay1, star(i).t / 1.5
  195.                         star(jay1).d = 400
  196.                     ELSE
  197.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  198.                             SendFleet i, jay2, star(i).t / 1.5
  199.                             star(jay2).d = 400
  200.                         END IF
  201.                     END IF
  202.                 END IF
  203.             END IF
  204.  
  205.             IF p = 1 THEN
  206.                 sf2 = 100
  207.                 FOR i = 0 TO 99
  208.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  209.                         sf3 = star(i).t / 2.5
  210.                         FOR j = 0 TO 99
  211.                             IF star(j).d > 0 THEN
  212.                                 star(j).d = star(j).d - 1
  213.                             ELSE
  214.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  215.                                     FOR k = 0 TO 99
  216.                                         IF star(k).o = id THEN
  217.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  218.                                             IF dist <= 250 * ratio THEN
  219.                                                 sf1 = i
  220.                                                 sf2 = j
  221.                                                 EXIT FOR
  222.                                             END IF
  223.                                         END IF
  224.                                     NEXT
  225.                                 END IF
  226.                             END IF
  227.                         NEXT
  228.                         IF sf2 < 100 THEN EXIT FOR
  229.                     END IF
  230.                 NEXT
  231.                 IF sf2 < 100 THEN
  232.                     SendFleet sf1, sf2, sf3
  233.                     star(sf2).d = 400
  234.                     EXIT FOR
  235.                 END IF
  236.             END IF
  237.  
  238.             IF p = 2 THEN
  239.                 FOR i = 0 TO 99
  240.                     IF i <> home(id) AND star(i).o = id THEN
  241.                         IF star(i).t > 49 THEN
  242.                             ok = 1
  243.                             FOR j = 0 TO 99
  244.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  245.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  246.                                     IF dist <= 400 * ratio THEN
  247.                                         ok = 0
  248.                                         EXIT FOR
  249.                                     END IF
  250.                                 END IF
  251.                             NEXT
  252.                             IF ok = 1 THEN
  253.                                 SendFleet i, home(id), star(i).t
  254.                                 EXIT FOR
  255.                             END IF
  256.                         END IF
  257.                     END IF
  258.                 NEXT
  259.                 IF ok = 1 THEN EXIT FOR
  260.             END IF
  261.  
  262.             IF p = 3 THEN
  263.                 ok = 0
  264.                 FOR i = 0 TO 99
  265.                     IF i <> home(id) AND star(i).o = id THEN
  266.                         IF star(i).t > LL * .25 * star(i).p THEN
  267.                             ok = 1
  268.                             EXIT FOR
  269.                         END IF
  270.                     END IF
  271.                 NEXT
  272.                 IF ok = 1 THEN
  273.                     SendFleet i, home(id), star(i).t / 4
  274.                     EXIT FOR
  275.                 END IF
  276.             END IF
  277.  
  278.         NEXT
  279.  
  280.     END IF
  281.  
  282. SUB GamePanel
  283.     x1 = sw / 4
  284.     y1 = sh / 4
  285.     speed = 0
  286.     _DEST gp
  287.     COLOR 0, 8
  288.     CLS
  289.     _FONT ttf72
  290.     n$ = "Beyond The Stars"
  291.     l = _PRINTWIDTH(n$)
  292.     _PRINTSTRING ((960 - l) / 2, 12), n$
  293.     LINE (40, 100)-(920, 100), 0
  294.     COLOR 7, 8
  295.     _FONT ttf36
  296.     _PRINTSTRING (42, 120), "Save"
  297.     _PRINTSTRING (42, 180), "Load"
  298.     COLOR 0, 7
  299.     FOR i = 143 TO 874 STEP 81
  300.         LINE (i, 115)-(i + 39, 158), 7, BF
  301.         LINE (i, 175)-(i + 39, 218), 7, BF
  302.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  303.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  304.     NEXT
  305.     n$ = "Custom Mode"
  306.     c = 7
  307.     IF cm = 1 THEN c = 168
  308.     l2 = 0
  309.     l1 = _PRINTWIDTH(n$)
  310.     LINE (40, 235)-(60 + l1, 295), c, BF
  311.     COLOR 0, c
  312.     _PRINTSTRING (50, 250), n$
  313.     n$ = "Demo Mode"
  314.     c = 7
  315.     IF dm = 1 THEN c = 168
  316.     l2 = l1
  317.     l1 = _PRINTWIDTH(n$)
  318.     LINE (76 + l2, 235)-(96 + l1 + l2, 295), c, BF
  319.     COLOR 0, c
  320.     _PRINTSTRING (86 + l2, 250), n$
  321.     n$ = "Rectangle"
  322.     l2 = l2 + l1
  323.     l1 = _PRINTWIDTH(n$)
  324.     c = 7
  325.     IF rm = 1 THEN c = 168
  326.     LINE (112 + l2, 235)-(132 + l1 + l2, 295), c, BF
  327.     COLOR 0, c
  328.     _PRINTSTRING (122 + l2, 250), n$
  329.     n$ = "New Game"
  330.     l2 = l2 + l1
  331.     l1 = _PRINTWIDTH(n$)
  332.     LINE (148 + l2, 235)-(168 + l1 + l2, 295), 7, BF
  333.     COLOR 0, 7
  334.     _PRINTSTRING (158 + l2, 250), n$
  335.     n$ = "Play a Duel"
  336.     l1 = _PRINTWIDTH(n$)
  337.     LINE (40, 310)-(60 + l1, 370), 7, BF
  338.     _PRINTSTRING (50, 325), n$
  339.     COLOR 7, 8
  340.     n$ = "Right Click To Cancel"
  341.     l = _PRINTWIDTH(n$)
  342.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  343.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  344.     _DEST 0
  345.  
  346. SUB GetInput
  347.  
  348.     IF ch = CHR$(27) THEN repeat = 0
  349.     IF ch = "n" THEN NewGame
  350.     IF ch = "t" THEN tt = 1 - tt
  351.     IF ch = "p" THEN paused = 1 - paused
  352.     IF ch = "+" THEN
  353.         IF speed < 10 THEN speed = speed + 1
  354.     END IF
  355.     IF ch = "-" THEN
  356.         IF speed > 0 THEN speed = speed - 1
  357.     END IF
  358.     IF ch = "q" THEN QuickSave
  359.     IF ch = "l" THEN QuickRestore
  360.     IF ch = "g" THEN
  361.         gact = 1
  362.         paused = 1
  363.     END IF
  364.     ch = INKEY$
  365.  
  366.  
  367.     lclk = 0
  368.     rclk = 0
  369.  
  370.  
  371.         lmb = _MOUSEBUTTON(1)
  372.         rmb = _MOUSEBUTTON(2)
  373.  
  374.         x = _MOUSEX
  375.  
  376.         IF lmb AND lcx = sw THEN lcx = x
  377.         IF rmb AND rcx = sw THEN rcx = x
  378.  
  379.     WEND
  380.  
  381.     x = _MOUSEX
  382.     y = _MOUSEY
  383.  
  384.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  385.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  386.  
  387.     lcx = sw
  388.     rcx = sw
  389.  
  390.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  391.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  392.             rclk = 0
  393.             oact = 0
  394.             pact = 0
  395.             gact = 0
  396.         ELSE
  397.             i = Identify
  398.             IF i = 100 THEN
  399.                 IF src = 100 THEN
  400.                     paused = 1 - paused
  401.                     ch = ""
  402.                 ELSE
  403.                     src = 100
  404.                 END IF
  405.                 rclk = 0
  406.             END IF
  407.         END IF
  408.     END IF
  409.  
  410.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 AND gact = 0 THEN
  411.         i = Identify
  412.         IF i = 100 THEN
  413.             gact = 1
  414.             lclk = 0
  415.         END IF
  416.     END IF
  417.  
  418.  
  419. FUNCTION Identify
  420.     ii = 100
  421.     FOR i = 0 TO 99
  422.         dx = star(i).x - x
  423.         dy = star(i).y - y
  424.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  425.             ii = i
  426.             EXIT FOR
  427.         END IF
  428.     NEXT
  429.     Identify = ii
  430.  
  431. SUB OrderPanel (i)
  432.     x1 = star(i).x - 420 * ratio
  433.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  434.     x2 = x1 + 400 * ratio
  435.     y1 = star(i).y
  436.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  437.     y2 = y1 + 225 * ratio
  438.     _DEST op
  439.     CLS 0, 8
  440.     COLOR 0, 8
  441.     _FONT ttf72
  442.     n$ = RTRIM$(star(i).n)
  443.     l = _PRINTWIDTH(n$)
  444.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  445.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  446.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  447.     COLOR 7, 8
  448.     _FONT ttf36
  449.     IF box = 0 THEN
  450.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  451.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  452.         LINE (xo, yo)-(xd, yd), 7, BF
  453.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  454.         LINE (xo, yo)-(xd, yd), 7, BF
  455.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  456.         LINE (xo, yo)-(xd, yd), 7, BF
  457.         n$ = RTRIM$(strng0)
  458.         COLOR 0, 7
  459.         _FONT ttf24
  460.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  461.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  462.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  463.     END IF
  464.     IF box = 1 THEN
  465.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  466.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  467.         LINE (xo, yo)-(xd, yd), 7, BF
  468.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  469.         LINE (xo, yo)-(xd, yd), 7, BF
  470.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  471.         LINE (xo, yo)-(xd, yd), 7, BF
  472.         n$ = RTRIM$(strng1)
  473.         COLOR 0, 7
  474.         _FONT ttf24
  475.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  476.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  477.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  478.     END IF
  479.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  480.     _DEST 0
  481.     oanx = x1: oany = y1
  482.  
  483. SUB PaintBackground
  484.     x = RND * sw
  485.     y = RND * sh
  486.     c = RND * 14 + 1
  487.     PSET (x, y), c
  488.     RANDOMIZE USING seed
  489.     FOR i = 1 TO 600 * ratio
  490.         x = RND * sw
  491.         y = RND * sh
  492.         c = RND * 14 + 1
  493.         PSET (x, y), c
  494.     NEXT
  495.  
  496. SUB PaintFleet
  497.     count = fltcnt
  498.     i = 0
  499.     WHILE count
  500.         IF fleet(i).o <> 0 THEN
  501.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, fleet(i).o + 8
  502.             count = count - 1
  503.         END IF
  504.         i = i + 1
  505.     WEND
  506.  
  507. SUB PaintStars
  508.  
  509.     'execute standing orders
  510.     FOR i = 0 TO 99
  511.         IF order(i).src <> 100 THEN
  512.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  513.                 order(i).src = 100
  514.             ELSE
  515.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  516.                 IF star(i).t >= order(i).ovr THEN
  517.                     SendFleet order(i).src, order(i).dst, order(i).shp
  518.                 END IF
  519.             END IF
  520.         END IF
  521.     NEXT
  522.  
  523.     FOR i = 0 TO 99
  524.         c = star(i).c
  525.         x = star(i).x
  526.         y = star(i).y
  527.         o = star(i).o
  528.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  529.         COLOR 15
  530.         IF o > 0 THEN
  531.             PAINT (x, y), o + 8, c
  532.         END IF
  533.         _FONT ttf16
  534.         IF tt THEN
  535.             n$ = star(i).n
  536.             n$ = RTRIM$(n$)
  537.             l = _PRINTWIDTH(n$)
  538.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  539.         ELSE
  540.             n$ = STR$(star(i).t)
  541.             l = _PRINTWIDTH(n$)
  542.         END IF
  543.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  544.     NEXT
  545.  
  546.  
  547. SUB Player
  548.  
  549.     ' Custom Map Mode
  550.     IF cm = 1 THEN
  551.         IF lmb THEN
  552.             i = Identify
  553.             IF i < 100 THEN
  554.                 WHILE _MOUSEINPUT: WEND
  555.                 nx = _MOUSEX
  556.                 ny = _MOUSEY
  557.                 ok = 1
  558.                 FOR j = 0 TO 99
  559.                     IF j <> i THEN
  560.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  561.                         IF dist <= 60 THEN
  562.                             ok = 0
  563.                             EXIT FOR
  564.                         END IF
  565.                     END IF
  566.                 NEXT
  567.                 IF ok = 1 THEN
  568.                     star(i).x = nx
  569.                     star(i).y = ny
  570.                 ELSE
  571.                     _MOUSEMOVE star(i).x, star(i).y
  572.                 END IF
  573.             END IF
  574.         END IF
  575.     END IF
  576.  
  577.     'Add new order to standing orders
  578.     IF ord.src <> 100 THEN
  579.         i = ord.src
  580.         IF ord.shp = 0 THEN
  581.             order(i).src = 100
  582.         ELSE
  583.             order(i) = ord
  584.         END IF
  585.         src = 100
  586.         ord.src = 100
  587.     END IF
  588.  
  589.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  590.  
  591.         'If there is no source star see if we can get one
  592.         IF src = 100 AND cm = 0 THEN
  593.             i = Identify
  594.             IF i < 100 THEN WorldPanel i
  595.             IF lclk = 1 OR rclk = 1 THEN
  596.                 lclk = 0
  597.                 rclk = 0
  598.                 src = i
  599.             END IF
  600.         END IF
  601.  
  602.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  603.         IF src <> 100 THEN
  604.             c = 12
  605.             FOR i = 0 TO 99
  606.                 IF star(i).o = 1 THEN
  607.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  608.                     IF dist <= 251 * ratio THEN
  609.                         c = 10
  610.                         EXIT FOR
  611.                     END IF
  612.                 END IF
  613.             NEXT
  614.             i = Identify
  615.             IF i <> 100 THEN
  616.                 x = star(i).x
  617.                 y = star(i).y
  618.             END IF
  619.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  620.             LINE (star(src).x, star(src).y)-(x, y), c
  621.             n$ = STR$(INT(rang))
  622.             _FONT ttf16
  623.             _PRINTSTRING (x + 20, y), n$, 0
  624.         END IF
  625.  
  626.         'If we have a source star see if we clicked on a destination star
  627.         IF src <> 100 THEN
  628.             IF lclk = 1 OR rclk = 1 THEN
  629.                 i = Identify
  630.                 IF i = src THEN
  631.                     lclk = 0
  632.                     src = 100
  633.                     IF rclk = 1 THEN
  634.                         rclk = 0
  635.                         order(i).src = 100
  636.                     END IF
  637.                 ELSE
  638.                     IF i < 100 AND i <> src THEN
  639.                         IF lclk = 1 THEN
  640.                             lclk = 0
  641.                             FOR j = 0 TO 99
  642.                                 IF star(j).o = 1 THEN
  643.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  644.                                     IF dist <= 250 THEN
  645.                                         dst = i
  646.                                         pact = 1
  647.                                         EXIT FOR
  648.                                     END IF
  649.                                 END IF
  650.                             NEXT
  651.                         ELSE
  652.                             rclk = 0
  653.                             dst = i
  654.                             IF star(i).o = 1 THEN
  655.                                 oact = 1
  656.                             END IF
  657.                         END IF
  658.                     END IF
  659.                 END IF
  660.             END IF
  661.         END IF
  662.     END IF
  663.  
  664.     'If the game panel is active
  665.     IF gact = 1 THEN
  666.         GamePanel
  667.         IF lclk = 1 THEN
  668.             FOR i = 143 TO 874 STEP 81
  669.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  670.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  671.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  672.                     SaveGame n$
  673.                 END IF
  674.                 y1 = y1 + 60: y2 = y2 + 60
  675.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  676.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  677.                     LoadGame n$
  678.                 END IF
  679.             NEXT
  680.             _FONT ttf36
  681.             l2 = 0
  682.             l1 = _PRINTWIDTH("Custom Mode")
  683.             IF fltcnt = 0 THEN
  684.                 x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  685.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  686.                     cm = 1 - cm
  687.                 END IF
  688.             END IF
  689.             l2 = l1
  690.             l1 = _PRINTWIDTH("Demo Mode")
  691.             x1 = 76 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  692.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  693.                 dm = 1 - dm
  694.                 IF dm = 0 THEN
  695.                     ncp = 5
  696.                     bmp = 2
  697.                 ELSE
  698.                     ncp = 6
  699.                     bmp = 1
  700.                 END IF
  701.             END IF
  702.             l2 = l2 + l1
  703.             l1 = _PRINTWIDTH("Rectangle")
  704.             x1 = 112 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  705.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  706.                 rm = 1 - rm
  707.             END IF
  708.             l2 = l2 + l1
  709.             l1 = _PRINTWIDTH("New Game")
  710.             x1 = 148 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  711.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  712.                 gact = 0
  713.                 NewGame
  714.             END IF
  715.             l1 = _PRINTWIDTH("Play a Duel")
  716.             x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 310 + sh / 4: y2 = y1 + 60
  717.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  718.                 gact = 0
  719.                 duel = 1
  720.                 NewGame
  721.             END IF
  722.         END IF
  723.     END IF
  724.  
  725.     'If the star standing orders panel is active
  726.     IF oact = 1 THEN
  727.  
  728.         IF star(src).o = 1 THEN
  729.             OrderPanel dst
  730.         END IF
  731.  
  732.         IF rclk = 1 THEN oact = 0
  733.  
  734.         IF box = 0 THEN
  735.             tmp$ = RTRIM$(strng0)
  736.         ELSE
  737.             tmp$ = RTRIM$(strng1)
  738.         END IF
  739.  
  740.         IF lclk = 1 THEN
  741.  
  742.             x1 = oanx: x2 = oanx + 400 * ratio
  743.             y1 = oany: y2 = oany + 540 * ratio
  744.  
  745.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  746.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  747.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  748.                     IF box = 0 THEN
  749.                         n$ = RTRIM$(strng0)
  750.                         l = LEN(n$)
  751.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  752.                     ELSE
  753.                         n$ = RTRIM$(strng1)
  754.                         l = LEN(n$)
  755.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  756.                     END IF
  757.                 END IF
  758.             END IF
  759.  
  760.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  761.  
  762.                 IF box = 0 THEN
  763.  
  764.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  765.                         ord.ovr = INT(VAL(strng0))
  766.                         box = 1
  767.                     END IF
  768.  
  769.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  770.                         strng0 = ""
  771.                     END IF
  772.  
  773.                 ELSE
  774.  
  775.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  776.                         IF INT(VAL(strng1)) > ord.ovr THEN
  777.                             strng1 = ""
  778.                         ELSE
  779.                             box = 0
  780.                             oact = 0
  781.                             ord.src = src
  782.                             ord.dst = dst
  783.                             ord.shp = VAL(strng1)
  784.                             strng0 = ""
  785.                             strng1 = ""
  786.                         END IF
  787.                     END IF
  788.  
  789.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  790.                         strng0 = ""
  791.                         strng1 = ""
  792.                         box = 0
  793.                     END IF
  794.  
  795.                 END IF
  796.  
  797.             END IF
  798.         END IF
  799.         x1 = 10000: y1 = 10000
  800.  
  801.     END IF
  802.  
  803.  
  804.     'If the fleet send panel is active
  805.     IF pact = 1 THEN
  806.         IF rclk = 1 THEN pact = 0
  807.         IF star(src).o = 1 THEN
  808.             ShowPanel dst
  809.         END IF
  810.         IF lclk = 1 THEN
  811.             tmp$ = RTRIM$(strng)
  812.  
  813.             x1 = panx: x2 = panx + 400 * ratio
  814.             y1 = pany: y2 = pany + 540 * ratio
  815.  
  816.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  817.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  818.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  819.                     strng = tmp$ + STR$(dig)
  820.                 END IF
  821.             END IF
  822.  
  823.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  824.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  825.                     pact = 0
  826.                     value = star(src).t
  827.                     SendFleet src, dst, value
  828.                     src = 100
  829.                 END IF
  830.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  831.                     pact = 0
  832.                     value = star(src).t / 2
  833.                     SendFleet src, dst, value
  834.                     src = 100
  835.                 END IF
  836.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  837.                     pact = 0
  838.                     value = star(src).t / 3
  839.                     SendFleet src, dst, value
  840.                     src = 100
  841.                 END IF
  842.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  843.                     strng = ""
  844.                 END IF
  845.             END IF
  846.  
  847.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  848.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  849.                     value = VAL(strng)
  850.                     strng = ""
  851.                     pact = 0
  852.                     IF value <= star(src).t AND star(src).t <> o THEN
  853.                         SendFleet src, dst, value
  854.                     END IF
  855.                     src = 100
  856.                 END IF
  857.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  858.                     pact = 0
  859.                     src = 100
  860.                     strng = ""
  861.                 END IF
  862.             END IF
  863.         END IF
  864.     END IF
  865.  
  866. SUB QuickSave
  867.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  868.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  869.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  870.     qfltcnt = fltcnt
  871.     qLL = LL
  872.  
  873. SUB QuickRestore
  874.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  875.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  876.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  877.     fltcnt = qfltcnt
  878.     LL = qLL
  879.     paused = 1
  880.  
  881. SUB LoadGame (n$)
  882.     n$ = n$ + ".sav"
  883.     IF _FILEEXISTS(n$) THEN
  884.         OPEN n$ FOR BINARY AS #2
  885.         GET #2, , star()
  886.         GET #2, , order()
  887.         GET #2, , fleet()
  888.         GET #2, , home()
  889.         GET #2, , fltcnt
  890.         GET #2, , LL
  891.         CLOSE #2
  892.         PRINT "Game Loaded"
  893.         dm = 0
  894.         cm = 0
  895.         ncp = 5
  896.         bmp = 2
  897.         it = 0
  898.     END IF
  899.  
  900. SUB SaveGame (n$)
  901.     n$ = n$ + ".sav"
  902.     OPEN n$ FOR BINARY AS #1
  903.     CLOSE #1
  904.     KILL n$
  905.     OPEN n$ FOR BINARY AS #1
  906.     PUT #1, , star()
  907.     PUT #1, , order()
  908.     PUT #1, , fleet()
  909.     PUT #1, , home()
  910.     PUT #1, , fltcnt
  911.     PUT #1, , LL
  912.     CLOSE #1
  913.     PRINT "Game Saved"
  914.  
  915. SUB SendFleet (src, dst, ships)
  916.     IF fltcnt < 2000 THEN
  917.         FOR i = 0 TO 1999
  918.             IF fleet(i).o = 0 THEN
  919.                 fleet(i).o = star(src).o
  920.                 fleet(i).d = dst
  921.                 fleet(i).x1 = star(src).x
  922.                 fleet(i).y1 = star(src).y
  923.                 fleet(i).x2 = star(dst).x
  924.                 fleet(i).y2 = star(dst).y
  925.                 fleet(i).t = ships
  926.                 star(src).t = star(src).t - ships
  927.                 fltcnt = fltcnt + 1
  928.                 EXIT FOR
  929.             END IF
  930.         NEXT
  931.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  932.     END IF
  933.  
  934. SUB ShowPanel (i)
  935.     x1 = star(i).x - 420 * ratio
  936.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  937.     x2 = x1 + 400 * ratio
  938.     y1 = star(i).y
  939.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  940.     y2 = y1 + 540 * ratio
  941.     _DEST sp
  942.     CLS 0, 8
  943.     COLOR 0, 8
  944.     _FONT ttf72
  945.     n$ = RTRIM$(star(src).n)
  946.     l = _PRINTWIDTH(n$)
  947.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  948.     n$ = "to"
  949.     l = _PRINTWIDTH(n$)
  950.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  951.     n$ = RTRIM$(star(dst).n)
  952.     l = _PRINTWIDTH(n$)
  953.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  954.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  955.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  956.     n$ = RTRIM$(strng)
  957.     l = _PRINTWIDTH(n$)
  958.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  959.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  960.     LINE (xo, yo)-(xd, yd), 7, BF
  961.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  962.     LINE (xo, yo)-(xd, yd), 7, BF
  963.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  964.     LINE (xo, yo)-(xd, yd), 7, BF
  965.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  966.     LINE (xo, yo)-(xd, yd), 7, BF
  967.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  968.     LINE (xo, yo)-(xd, yd), 7, BF
  969.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  970.     LINE (xo, yo)-(xd, yd), 7, BF
  971.     _FONT ttf24
  972.     COLOR 7, 8
  973.     n$ = RTRIM$(STR$(star(src).t))
  974.     l = _PRINTWIDTH(n$)
  975.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  976.     n$ = RTRIM$(STR$(star(dst).t))
  977.     l = _PRINTWIDTH(n$)
  978.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  979.     _FONT ttf16
  980.     COLOR 0, 7
  981.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  982.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  983.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  984.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  985.     _FONT ttf72
  986.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  987.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  988.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  989.     panx = x1: pany = y1
  990.     _DEST 0
  991.  
  992. SUB Update
  993.     IF paused = 0 THEN
  994.         RANDOMIZE TIMER
  995.         FOR i = 0 TO 99
  996.             r = INT(RND * 60)
  997.             IF r < star(i).p THEN
  998.                 IF star(i).o > 0 THEN
  999.                     star(i).t = star(i).t + 1
  1000.                 ELSE
  1001.                     IF INT(RND * 10) < 3 THEN
  1002.                         star(i).t = star(i).t + 1
  1003.                     END IF
  1004.                 END IF
  1005.             END IF
  1006.         NEXT
  1007.  
  1008.         count = fltcnt
  1009.         i = 0
  1010.         WHILE count
  1011.             IF fleet(i).o <> 0 THEN
  1012.                 count = count - 1
  1013.                 IF fleet(i).x2 > fleet(i).x1 THEN
  1014.                     fleet(i).x1 = fleet(i).x1 + 1
  1015.                 END IF
  1016.                 IF fleet(i).x2 < fleet(i).x1 THEN
  1017.                     fleet(i).x1 = fleet(i).x1 - 1
  1018.                 END IF
  1019.                 IF fleet(i).y2 > fleet(i).y1 THEN
  1020.                     fleet(i).y1 = fleet(i).y1 + 1
  1021.                 END IF
  1022.                 IF fleet(i).y2 < fleet(i).y1 THEN
  1023.                     fleet(i).y1 = fleet(i).y1 - 1
  1024.                 END IF
  1025.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  1026.                     dest = fleet(i).d
  1027.                     IF star(dest).o = fleet(i).o THEN
  1028.                         star(dest).t = star(dest).t + fleet(i).t
  1029.                         fleet(i).o = 0
  1030.                         fltcnt = fltcnt - 1
  1031.                     ELSE
  1032.                         o = star(dest).o
  1033.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  1034.                             k = 100
  1035.                             shortest = 10000
  1036.                             FOR j = 0 TO 99
  1037.                                 IF star(j).o = o THEN
  1038.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  1039.                                     IF dist < shortest THEN
  1040.                                         shortest = dist
  1041.                                         k = j
  1042.                                     END IF
  1043.                                 END IF
  1044.                             NEXT
  1045.                             SendFleet dest, k, star(dest).t * 0.90
  1046.                             star(dest).t = 0
  1047.                             star(dest).o = fleet(i).o
  1048.                             star(dest).t = fleet(i).t
  1049.                             star(dest).o = fleet(i).o
  1050.                             fleet(i).o = 0
  1051.                             fltcnt = fltcnt - 1
  1052.                         ELSE
  1053.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  1054.                                 alive = 1
  1055.                                 WHILE alive
  1056.                                     alive = 0
  1057.                                     damorg = fleet(i).t / 10 + 1
  1058.                                     damdst = star(dest).t / 8 + 1
  1059.                                     fleet(i).t = fleet(i).t - damdst
  1060.                                     star(dest).t = star(dest).t - damorg
  1061.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  1062.                                         alive = 1
  1063.                                     END IF
  1064.                                 WEND
  1065.                                 IF star(dest).t < 1 THEN
  1066.                                     star(dest).t = fleet(i).t
  1067.                                     star(dest).o = fleet(i).o
  1068.                                 END IF
  1069.                                 fleet(i).o = 0
  1070.                                 fltcnt = fltcnt - 1
  1071.                             ELSE
  1072.                                 k = 100
  1073.                                 shortest = 10000
  1074.                                 FOR j = 0 TO 99
  1075.                                     IF star(j).o = fleet(i).o THEN
  1076.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1077.                                         IF dist < shortest THEN
  1078.                                             shortest = dist
  1079.                                             k = j
  1080.                                         END IF
  1081.                                     END IF
  1082.                                 NEXT
  1083.                                 IF k < 100 THEN
  1084.                                     fleet(i).x2 = star(k).x
  1085.                                     fleet(i).y2 = star(k).y
  1086.                                     fleet(i).d = k
  1087.                                 ELSE
  1088.                                     fleet(i).o = 0
  1089.                                     fltcnt = fltcnt - 1
  1090.                                 END IF
  1091.                             END IF
  1092.                         END IF
  1093.                     END IF
  1094.                 END IF
  1095.             END IF
  1096.             i = i + 1
  1097.         WEND
  1098.     END IF
  1099.  
  1100. SUB WorldPanel (i)
  1101.     x1 = star(i).x - 420 * ratio
  1102.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1103.     x2 = x1 + 400 * ratio
  1104.     y1 = star(i).y
  1105.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1106.     y2 = y1 + 225 * ratio
  1107.     _DEST wp
  1108.     CLS 0, 8
  1109.     COLOR 0, 8
  1110.     _FONT ttf72
  1111.     n$ = RTRIM$(star(i).n)
  1112.     l = _PRINTWIDTH(n$)
  1113.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1114.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1115.     COLOR 7, 8
  1116.     _FONT ttf36
  1117.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1118.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1119.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1120.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1121.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1122.     n$ = "NO"
  1123.     FOR j = 0 TO 99
  1124.         IF star(i).o <> star(j).o THEN
  1125.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1126.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1127.                 IF dist <= 250 THEN
  1128.                     n$ = "YES"
  1129.                     EXIT FOR
  1130.                 END IF
  1131.             END IF
  1132.         END IF
  1133.     NEXT
  1134.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1135.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1136.     _DEST 0
  1137.  
  1138. SUB NewGame
  1139.     DIM k AS INTEGER
  1140.     DIM r AS INTEGER
  1141.     DIM dx AS INTEGER
  1142.     DIM dy AS INTEGER
  1143.     DIM n AS STRING * 10
  1144.     DIM low AS LONG
  1145.     DIM high AS LONG
  1146.     DIM tot AS LONG
  1147.     paused = 1
  1148.     FOR i = 0 TO 999
  1149.         fleet(i).o = 0
  1150.     NEXT
  1151.     slct = 0
  1152.     fltcnt = 0
  1153.     LL = 0
  1154.     seed = RND * 1000
  1155.     FOR i = 0 TO 99
  1156.         k = 1
  1157.         WHILE k
  1158.             k = 0
  1159.             ok = 0
  1160.             DO
  1161.                 x = RND * (sw - sww) + swn
  1162.                 y = RND * (sh - shw) + shn
  1163.                 ok = -1
  1164.                 IF rm = 1 AND x > sw / 4 AND x < sw - sw / 4 AND y > sh / 4 AND y < sh - sh / 4 THEN ok = 0
  1165.             LOOP UNTIL ok
  1166.             r = INT(RND * 200)
  1167.             n = names(r)
  1168.             FOR j = 0 TO i - 1
  1169.                 dx = x - star(j).x
  1170.                 dy = y - star(j).y
  1171.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1172.                     k = 1
  1173.                 END IF
  1174.                 IF n = star(j).n THEN
  1175.                     k = 1
  1176.                 END IF
  1177.             NEXT
  1178.         WEND
  1179.         star(i).n = n
  1180.         star(i).x = x
  1181.         star(i).y = y
  1182.         star(i).c = RND * 6 + 9
  1183.         star(i).s = RND * 5
  1184.         star(i).o = 0
  1185.         star(i).p = star(i).s + (RND * 5) + 3
  1186.         star(i).t = 0
  1187.         order(i).src = 100
  1188.     NEXT
  1189.     low = 10000000
  1190.     high = 0
  1191.     IF duel = 1 THEN
  1192.         FOR j = 0 TO 99
  1193.             x = star(j).x
  1194.             y = star(j).y
  1195.             tot = x * y
  1196.             IF tot < low THEN
  1197.                 low = tot
  1198.                 a = j
  1199.             END IF
  1200.             IF tot > high THEN
  1201.                 high = tot
  1202.                 b = j
  1203.             END IF
  1204.         NEXT
  1205.         home(1) = a
  1206.         star(a).o = 1
  1207.         star(a).p = 10
  1208.         star(a).t = 100
  1209.         star(a).s = 4
  1210.         star(a).n = "Sol"
  1211.         star(a).c = 14
  1212.  
  1213.         home(2) = b
  1214.         star(b).o = 2
  1215.         star(b).p = 10
  1216.         star(b).t = 100
  1217.         star(b).s = 4
  1218.     ELSE
  1219.         FOR i = 1 TO 6
  1220.             ok = 0
  1221.             WHILE (ok < 1)
  1222.                 ok = 1
  1223.                 j = RND * 100
  1224.                 FOR k = 1 TO i - 1
  1225.                     dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1226.                     IF dist < 500 * ratio THEN
  1227.                         ok = 0
  1228.                         EXIT FOR
  1229.                     END IF
  1230.                 NEXT
  1231.                 IF ok = 1 THEN
  1232.                     ok = -1
  1233.                     FOR k = 0 TO 99
  1234.                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1235.                         IF dist <= 200 THEN ok = ok + 1
  1236.                         IF ok = 2 THEN EXIT FOR
  1237.                     NEXT
  1238.                 END IF
  1239.             WEND
  1240.             home(i) = j
  1241.             star(j).o = i
  1242.             star(j).p = 10
  1243.             star(j).t = 100
  1244.             star(j).s = 4
  1245.         NEXT
  1246.     END IF
  1247.     star(home(1)).n = "Sol"
  1248.     star(home(1)).c = 14
  1249.     ncp = 5
  1250.     bmp = 2
  1251.     dm = 0
  1252.     speed = 0
  1253.     QuickSave
  1254.  
  1255. ' A lot of star names I made up
  1256.  
  1257. SUB StarNames
  1258.     names(0) = "Acamar"
  1259.     names(1) = "Arcab"
  1260.     names(2) = "Acrux"
  1261.     names(3) = "Adhara"
  1262.     names(4) = "Arneb"
  1263.     names(5) = "Antares"
  1264.     names(6) = "Arcturus"
  1265.     names(7) = "Atria"
  1266.     names(8) = "Beid"
  1267.     names(9) = "Betelgeuse"
  1268.     names(10) = "Botein"
  1269.     names(11) = "Beemim"
  1270.     names(12) = "Bellatrix"
  1271.     names(13) = "Bharani"
  1272.     names(14) = "Biham"
  1273.     names(15) = "Brachium"
  1274.     names(16) = "Canopus"
  1275.     names(17) = "Capella"
  1276.     names(18) = "Castor"
  1277.     names(19) = "Chara"
  1278.     names(20) = "Cursa"
  1279.     names(21) = "Copernicus"
  1280.     names(22) = "Chalawan"
  1281.     names(23) = "Chertan"
  1282.     names(24) = "Dabih"
  1283.     names(25) = "Dalim"
  1284.     names(26) = "Deneb"
  1285.     names(27) = "Denebola"
  1286.     names(28) = "Diadem"
  1287.     names(29) = "Diphda"
  1288.     names(30) = "Dschubba"
  1289.     names(31) = "Dziban"
  1290.     names(32) = "Edasich"
  1291.     names(33) = "Electra"
  1292.     names(34) = "Elgafar"
  1293.     names(35) = "Elkurud"
  1294.     names(36) = "Elnath"
  1295.     names(37) = "Eltanin"
  1296.     names(38) = "Enif"
  1297.     names(39) = "Errai"
  1298.     names(40) = "Fafnir"
  1299.     names(41) = "Fang"
  1300.     names(42) = "Fawaris"
  1301.     names(43) = "Felis"
  1302.     names(44) = "Fomalhaut"
  1303.     names(45) = "Fulu"
  1304.     names(46) = "Fumal"
  1305.     names(47) = "Furud"
  1306.     names(48) = "Garnet"
  1307.     names(49) = "Giausar"
  1308.     names(50) = "Gienah"
  1309.     names(51) = "Ginan"
  1310.     names(52) = "Gomeisa"
  1311.     names(53) = "Graffias"
  1312.     names(54) = "Grumium"
  1313.     names(55) = "Gudja"
  1314.     names(56) = "Hadar"
  1315.     names(57) = "Haedus"
  1316.     names(58) = "Hamal"
  1317.     names(59) = "Hassaleh"
  1318.     names(60) = "Hatysa"
  1319.     names(61) = "Helvetios"
  1320.     names(62) = "Heze"
  1321.     names(63) = "Homan"
  1322.     names(64) = "Iklil"
  1323.     names(65) = "Imai"
  1324.     names(66) = "Intercrus"
  1325.     names(67) = "Izar"
  1326.     names(68) = "Iccar"
  1327.     names(69) = "Inar"
  1328.     names(70) = "Iaeth"
  1329.     names(71) = "Imaous"
  1330.     names(72) = "Jabbah"
  1331.     names(73) = "Jishui"
  1332.     names(74) = "Jax"
  1333.     names(75) = "Jalae"
  1334.     names(76) = "Jewel"
  1335.     names(77) = "Jumbo"
  1336.     names(78) = "Jerue"
  1337.     names(79) = "Jabear"
  1338.     names(80) = "Kakkab"
  1339.     names(81) = "Kang"
  1340.     names(82) = "Kekouan"
  1341.     names(83) = "Keid"
  1342.     names(84) = "Kitalpha"
  1343.     names(85) = "Kochab"
  1344.     names(86) = "Kolob"
  1345.     names(87) = "Kobol"
  1346.     names(88) = "Larawag"
  1347.     names(89) = "Lesath"
  1348.     names(90) = "Libertas"
  1349.     names(91) = "Lich"
  1350.     names(92) = "Lilly"
  1351.     names(93) = "Laddel"
  1352.     names(94) = "Luminous"
  1353.     names(95) = "Lasacious"
  1354.     names(96) = "Mizar"
  1355.     names(97) = "Markab"
  1356.     names(98) = "Matar"
  1357.     names(99) = "Mintaka"
  1358.     names(100) = "Meleph"
  1359.     names(101) = "Menkar"
  1360.     names(102) = "Merga"
  1361.     names(103) = "Merope"
  1362.     names(104) = "Nahn"
  1363.     names(105) = "Naos"
  1364.     names(106) = "Nashira"
  1365.     names(107) = "Navi"
  1366.     names(108) = "Nekkar"
  1367.     names(109) = "Nembus"
  1368.     names(110) = "Nihal"
  1369.     names(111) = "Nunki"
  1370.     names(112) = "Ogma"
  1371.     names(113) = "Okab"
  1372.     names(114) = "Ohmy"
  1373.     names(115) = "Oragami"
  1374.     names(116) = "Origen"
  1375.     names(117) = "Omanii"
  1376.     names(118) = "Obytewa"
  1377.     names(119) = "Oglok"
  1378.     names(120) = "Phact"
  1379.     names(121) = "Pherkad"
  1380.     names(122) = "Pleione"
  1381.     names(122) = "Polaris"
  1382.     names(123) = "Pollux"
  1383.     names(124) = "Procyon"
  1384.     names(125) = "Proxima"
  1385.     names(126) = "Polis"
  1386.     names(127) = "Quaint"
  1387.     names(128) = "QB64"
  1388.     names(129) = "Quetzal"
  1389.     names(130) = "Qussol"
  1390.     names(131) = "Quella"
  1391.     names(132) = "Quyaeo"
  1392.     names(133) = "Ququdas"
  1393.     names(134) = "Quekak"
  1394.     names(135) = "Rasalas"
  1395.     names(136) = "Regor"
  1396.     names(137) = "Regulus"
  1397.     names(138) = "Rigel"
  1398.     names(139) = "Revati"
  1399.     names(140) = "Rotenev"
  1400.     names(141) = "Rukbat"
  1401.     names(142) = "Rastaban"
  1402.     names(143) = "Sabik"
  1403.     names(144) = "Sadr"
  1404.     names(145) = "Saiph"
  1405.     names(146) = "Sargas"
  1406.     names(147) = "Sarin"
  1407.     names(148) = "Syrma"
  1408.     names(149) = "Spica"
  1409.     names(150) = "Sirius"
  1410.     names(151) = "Tarazed"
  1411.     names(152) = "Taygeta"
  1412.     names(153) = "Tejat"
  1413.     names(154) = "Thabit"
  1414.     names(155) = "Thuban"
  1415.     names(156) = "Tiaki"
  1416.     names(157) = "Toliman"
  1417.     names(158) = "Torcular"
  1418.     names(157) = "Umala"
  1419.     names(158) = "Ulatte"
  1420.     names(159) = "Ubbessa"
  1421.     names(160) = "Unoless"
  1422.     names(161) = "Umaddem"
  1423.     names(162) = "Ummbra"
  1424.     names(162) = "Uniqu"
  1425.     names(163) = "Uzzaal"
  1426.     names(164) = "Vega"
  1427.     names(165) = "Veritate"
  1428.     names(166) = "Vindetrix"
  1429.     names(167) = "Vedas"
  1430.     names(168) = "Vergg"
  1431.     names(169) = "Vacant"
  1432.     names(170) = "Vucae"
  1433.     names(171) = "Vicar"
  1434.     names(172) = "Wasat"
  1435.     names(173) = "Wazn"
  1436.     names(174) = "Wezen"
  1437.     names(175) = "Waiten"
  1438.     names(176) = "Wachar"
  1439.     names(177) = "Wheelz"
  1440.     names(178) = "Whatsp"
  1441.     names(179) = "Wassand"
  1442.     names(180) = "Xenno"
  1443.     names(181) = "Xyphod"
  1444.     names(182) = "Xu"
  1445.     names(183) = "Xaal"
  1446.     names(184) = "Xyross"
  1447.     names(185) = "Xiggot"
  1448.     names(186) = "Xirrks"
  1449.     names(187) = "Yed"
  1450.     names(188) = "Yildun"
  1451.     names(189) = "Yundun"
  1452.     names(190) = "Yavyo"
  1453.     names(191) = "Yotrac"
  1454.     names(192) = "Yxzoqu"
  1455.     names(193) = "Ynnot"
  1456.     names(194) = "Zaniah"
  1457.     names(195) = "Zaurak"
  1458.     names(196) = "Zhang"
  1459.     names(197) = "Zibal"
  1460.     names(198) = "Zosma"
  1461.     names(199) = "Zuben"
  1462.  
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #13 on: January 25, 2020, 03:44:52 am »
Added a few cool updates. An exit game button in the upper right hand corner of the game Panel. I have to add a save game on exit. Game stats are now displayed at the bottom of the game panel. And the colored stat boxes double as a color picker. Now you can click on another color at any time if you prefer to play with a different color. And beware the computer players expand in the beginning much faster now making the start of the game even more challenging. Also it seems the computer plays even better now! Also one of the star names has been changed to QB64! :)

Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56. DIM SHARED colors(7) AS INTEGER
  57.  
  58. sw = _DESKTOPWIDTH '                   native video with of syatem
  59. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  60. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  61. nw = 1920
  62.  
  63. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  64.  
  65. shw = sh / 20
  66. shn = sh / 40
  67. nh = 1080
  68.  
  69. tt = 0
  70. lcx = sw
  71. rcx = sw
  72. cp = 100
  73. h = 100
  74. ar = 0
  75. rng = 200
  76. slct = 0
  77. strng = ""
  78. strng0 = ""
  79. strng1 = ""
  80. src = 100
  81. dst = 100
  82. ord.src = 100
  83. ncp = 5
  84. bmp = 2
  85.  
  86. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  87.  
  88.  
  89. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  90. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  91. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  92. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  93.  
  94. StarNames
  95.  
  96. NewGame
  97.  
  98. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  99. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  100. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  101. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  102.  
  103. repeat = 1
  104.  
  105. WHILE repeat
  106.  
  107.     CLS
  108.  
  109.     PaintBackground
  110.  
  111.     PaintStars
  112.  
  113.     PaintFleet
  114.  
  115.     FOR it = 0 TO speed
  116.  
  117.         Update
  118.  
  119.         GetInput
  120.  
  121.         Player
  122.  
  123.         Computer
  124.  
  125.     NEXT
  126.  
  127.     _DISPLAY
  128.  
  129.  
  130.  
  131. SUB Computer
  132.  
  133.     IF paused = 0 THEN
  134.         IF duel = 1 THEN id = 2 ELSE id = INT(RND * ncp) + bmp
  135.         i = home(id)
  136.         IF star(i).o <> id THEN
  137.             FOR j = 0 TO 99
  138.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  139.             NEXT
  140.         END IF
  141.  
  142.         FOR p = 0 TO 3
  143.  
  144.             IF p = 0 THEN
  145.                 IF star(i).t > LL THEN
  146.                     away = 10000
  147.                     FOR j = 0 TO 99
  148.                         IF star(j).o <> id THEN
  149.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  150.                             IF dist < away THEN
  151.                                 away = dist
  152.                                 o = star(j).o
  153.                             END IF
  154.                         END IF
  155.                     NEXT
  156.                     away1 = 10000
  157.                     away2 = 10000
  158.                     jay1 = 100
  159.                     jay2 = 100
  160.                     FOR j = 0 TO 99
  161.                         IF star(j).o = o THEN
  162.                             IF star(j).d > 0 THEN
  163.                                 star(j).d = star(j).d - 1
  164.                             ELSE
  165.                                 ok = 0
  166.                                 FOR k = 0 TO 99
  167.                                     IF star(k).o = id THEN
  168.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  169.                                         IF dist <= 250 THEN
  170.                                             ok = 1
  171.                                             EXIT FOR
  172.                                         END IF
  173.                                     END IF
  174.                                 NEXT
  175.                                 IF ok = 1 THEN
  176.                                     dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  177.                                     IF dist < away1 THEN
  178.                                         IF away1 < away2 THEN
  179.                                             away2 = away1
  180.                                             jay2 = jay1
  181.                                         END IF
  182.                                         away1 = dist
  183.                                         jay1 = j
  184.                                     ELSE
  185.                                         IF dist < away2 THEN
  186.                                             away2 = dist
  187.                                             jay2 = j
  188.                                         END IF
  189.                                     END IF
  190.                                 END IF
  191.                             END IF
  192.                         END IF
  193.                     NEXT
  194.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  195.                         SendFleet i, jay1, star(jay1).t * 2 + 10
  196.                         star(jay1).d = 400
  197.                     ELSE
  198.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  199.                             SendFleet i, jay2, star(jay2).t * 2 + 10
  200.                             star(jay2).d = 400
  201.                         END IF
  202.                     END IF
  203.                 END IF
  204.             END IF
  205.  
  206.             IF p = 1 THEN
  207.                 sf2 = 100
  208.                 FOR i = 0 TO 99
  209.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  210.                         sf3 = star(i).t / 2.5
  211.                         FOR j = 0 TO 99
  212.                             IF star(j).d > 0 THEN
  213.                                 star(j).d = star(j).d - 1
  214.                             ELSE
  215.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  216.                                     FOR k = 0 TO 99
  217.                                         IF star(k).o = id THEN
  218.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  219.                                             IF dist <= 250 * ratio THEN
  220.                                                 sf1 = i
  221.                                                 sf2 = j
  222.                                                 EXIT FOR
  223.                                             END IF
  224.                                         END IF
  225.                                     NEXT
  226.                                 END IF
  227.                             END IF
  228.                         NEXT
  229.                         IF sf2 < 100 THEN EXIT FOR
  230.                     END IF
  231.                 NEXT
  232.                 IF sf2 < 100 THEN
  233.                     SendFleet sf1, sf2, sf3
  234.                     star(sf2).d = 400
  235.                     EXIT FOR
  236.                 END IF
  237.             END IF
  238.  
  239.             IF p = 2 THEN
  240.                 FOR i = 0 TO 99
  241.                     IF i <> home(id) AND star(i).o = id THEN
  242.                         IF star(i).t > 49 THEN
  243.                             ok = 1
  244.                             FOR j = 0 TO 99
  245.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  246.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  247.                                     IF dist <= 400 * ratio THEN
  248.                                         ok = 0
  249.                                         EXIT FOR
  250.                                     END IF
  251.                                 END IF
  252.                             NEXT
  253.                             IF ok = 1 THEN
  254.                                 SendFleet i, home(id), star(i).t
  255.                                 EXIT FOR
  256.                             END IF
  257.                         END IF
  258.                     END IF
  259.                 NEXT
  260.                 IF ok = 1 THEN EXIT FOR
  261.             END IF
  262.  
  263.             IF p = 3 THEN
  264.                 ok = 0
  265.                 FOR i = 0 TO 99
  266.                     IF i <> home(id) AND star(i).o = id THEN
  267.                         IF star(i).t > LL * 2 THEN
  268.                             ok = 1
  269.                             EXIT FOR
  270.                         END IF
  271.                     END IF
  272.                 NEXT
  273.                 IF ok = 1 THEN
  274.                     SendFleet i, home(id), star(i).t / 4
  275.                     EXIT FOR
  276.                 END IF
  277.             END IF
  278.  
  279.         NEXT
  280.  
  281.     END IF
  282.  
  283. SUB GamePanel
  284.     x1 = sw / 4
  285.     y1 = sh / 4
  286.     speed = 0
  287.     _DEST gp
  288.     COLOR 0, 8
  289.     CLS
  290.     _FONT ttf72
  291.     n$ = "Beyond The Stars"
  292.     l = _PRINTWIDTH(n$)
  293.     _PRINTSTRING ((960 - l) / 2, 12), n$
  294.     LINE (40, 100)-(920, 100), 0
  295.     COLOR 7, 8
  296.     _FONT ttf36
  297.     _PRINTSTRING (42, 120), "Save"
  298.     _PRINTSTRING (42, 180), "Load"
  299.     COLOR 0, 7
  300.     LINE (910, 10)-(950, 50), 7, BF
  301.     _PRINTSTRING (921, 11), "x"
  302.     FOR i = 146 TO 886 STEP 82
  303.         LINE (i, 115)-(i + 39, 158), 7, BF
  304.         LINE (i, 175)-(i + 39, 218), 7, BF
  305.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  306.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  307.     NEXT
  308.     n$ = "Custom Mode"
  309.     c = 7
  310.     IF cm = 1 THEN c = 168
  311.     l2 = 0
  312.     l1 = _PRINTWIDTH(n$)
  313.     LINE (40, 235)-(60 + l1, 295), c, BF
  314.     COLOR 0, c
  315.     _PRINTSTRING (50, 250), n$
  316.     n$ = "Demo Mode"
  317.     c = 7
  318.     IF dm = 1 THEN c = 168
  319.     l2 = l1
  320.     l1 = _PRINTWIDTH(n$)
  321.     LINE (76 + l2, 235)-(96 + l1 + l2, 295), c, BF
  322.     COLOR 0, c
  323.     _PRINTSTRING (86 + l2, 250), n$
  324.     n$ = "Rectangle"
  325.     l2 = l2 + l1
  326.     l1 = _PRINTWIDTH(n$)
  327.     c = 7
  328.     IF rm = 1 THEN c = 168
  329.     LINE (112 + l2, 235)-(132 + l1 + l2, 295), c, BF
  330.     COLOR 0, c
  331.     _PRINTSTRING (122 + l2, 250), n$
  332.     n$ = "New Game"
  333.     l2 = l2 + l1
  334.     l1 = _PRINTWIDTH(n$)
  335.     LINE (148 + l2, 235)-(168 + l1 + l2, 295), 7, BF
  336.     COLOR 0, 7
  337.     _PRINTSTRING (158 + l2, 250), n$
  338.     n$ = "Play a Duel"
  339.     l1 = _PRINTWIDTH(n$)
  340.     LINE (40, 310)-(60 + l1, 370), 7, BF
  341.     _PRINTSTRING (50, 325), n$
  342.     _FONT ttf24
  343.     FOR i = 134 TO 874 STEP 134
  344.         j = j + 1
  345.         prod = 0
  346.         ship = 0
  347.         FOR k = 0 TO 99
  348.             IF star(k).o = j THEN
  349.                 prod = prod + star(k).p
  350.                 ship = ship + star(k).t
  351.             END IF
  352.         NEXT
  353.         LINE (i, 386)-(i + 120, 490), colors(j), BF
  354.         COLOR 0, colors(j)
  355.         _PRINTSTRING (i, 408), STR$(prod)
  356.         _PRINTSTRING (i, 448), STR$(ship)
  357.     NEXT
  358.     _FONT ttf36
  359.     COLOR 7, 8
  360.     _PRINTSTRING (40, 400), "Prod:"
  361.     _PRINTSTRING (40, 444), "Ship:"
  362.     n$ = "           Left Click Color Picker      Right Click To Close"
  363.     l = _PRINTWIDTH(n$)
  364.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  365.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  366.     _DEST 0
  367.  
  368. SUB GetInput
  369.  
  370.     IF ch = CHR$(27) THEN repeat = 0
  371.     IF ch = "n" THEN NewGame
  372.     IF ch = "t" THEN tt = 1 - tt
  373.     IF ch = "p" THEN paused = 1 - paused
  374.     IF ch = "+" THEN
  375.         IF speed < 10 THEN speed = speed + 1
  376.     END IF
  377.     IF ch = "-" THEN
  378.         IF speed > 0 THEN speed = speed - 1
  379.     END IF
  380.     IF ch = "q" THEN QuickSave
  381.     IF ch = "l" THEN QuickRestore
  382.     IF ch = "g" THEN
  383.         gact = 1
  384.         paused = 1
  385.     END IF
  386.     ch = INKEY$
  387.  
  388.  
  389.     lclk = 0
  390.     rclk = 0
  391.  
  392.  
  393.         lmb = _MOUSEBUTTON(1)
  394.         rmb = _MOUSEBUTTON(2)
  395.  
  396.         x = _MOUSEX
  397.  
  398.         IF lmb AND lcx = sw THEN lcx = x
  399.         IF rmb AND rcx = sw THEN rcx = x
  400.  
  401.     WEND
  402.  
  403.     x = _MOUSEX
  404.     y = _MOUSEY
  405.  
  406.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  407.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  408.  
  409.     lcx = sw
  410.     rcx = sw
  411.  
  412.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  413.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  414.             rclk = 0
  415.             oact = 0
  416.             pact = 0
  417.             gact = 0
  418.         ELSE
  419.             i = Identify
  420.             IF i = 100 THEN
  421.                 IF src = 100 THEN
  422.                     paused = 1 - paused
  423.                     ch = ""
  424.                 ELSE
  425.                     src = 100
  426.                 END IF
  427.                 rclk = 0
  428.             END IF
  429.         END IF
  430.     END IF
  431.  
  432.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 AND gact = 0 THEN
  433.         i = Identify
  434.         IF i = 100 THEN
  435.             gact = 1
  436.             lclk = 0
  437.         END IF
  438.     END IF
  439.  
  440.  
  441. FUNCTION Identify
  442.     ii = 100
  443.     FOR i = 0 TO 99
  444.         dx = star(i).x - x
  445.         dy = star(i).y - y
  446.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  447.             ii = i
  448.             EXIT FOR
  449.         END IF
  450.     NEXT
  451.     Identify = ii
  452.  
  453. SUB OrderPanel (i)
  454.     x1 = star(i).x - 420 * ratio
  455.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  456.     x2 = x1 + 400 * ratio
  457.     y1 = star(i).y
  458.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  459.     y2 = y1 + 225 * ratio
  460.     _DEST op
  461.     CLS 0, 8
  462.     COLOR 0, 8
  463.     _FONT ttf72
  464.     n$ = RTRIM$(star(i).n)
  465.     l = _PRINTWIDTH(n$)
  466.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  467.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  468.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  469.     COLOR 7, 8
  470.     _FONT ttf36
  471.     IF box = 0 THEN
  472.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  473.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  474.         LINE (xo, yo)-(xd, yd), 7, BF
  475.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  476.         LINE (xo, yo)-(xd, yd), 7, BF
  477.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  478.         LINE (xo, yo)-(xd, yd), 7, BF
  479.         n$ = RTRIM$(strng0)
  480.         COLOR 0, 7
  481.         _FONT ttf24
  482.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  483.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  484.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  485.     END IF
  486.     IF box = 1 THEN
  487.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  488.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  489.         LINE (xo, yo)-(xd, yd), 7, BF
  490.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  491.         LINE (xo, yo)-(xd, yd), 7, BF
  492.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  493.         LINE (xo, yo)-(xd, yd), 7, BF
  494.         n$ = RTRIM$(strng1)
  495.         COLOR 0, 7
  496.         _FONT ttf24
  497.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  498.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  499.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  500.     END IF
  501.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  502.     _DEST 0
  503.     oanx = x1: oany = y1
  504.  
  505. SUB PaintBackground
  506.     x = RND * sw
  507.     y = RND * sh
  508.     c = RND * 14 + 1
  509.     PSET (x, y), c
  510.     RANDOMIZE USING seed
  511.     FOR i = 1 TO 600 * ratio
  512.         x = RND * sw
  513.         y = RND * sh
  514.         c = RND * 14 + 1
  515.         PSET (x, y), c
  516.     NEXT
  517.  
  518. SUB PaintFleet
  519.     count = fltcnt
  520.     i = 0
  521.     WHILE count
  522.         IF fleet(i).o <> 0 THEN
  523.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, colors(fleet(i).o)
  524.             count = count - 1
  525.         END IF
  526.         i = i + 1
  527.     WEND
  528.  
  529. SUB PaintStars
  530.  
  531.     'execute standing orders
  532.     FOR i = 0 TO 99
  533.         IF order(i).src <> 100 THEN
  534.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  535.                 order(i).src = 100
  536.             ELSE
  537.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  538.                 IF star(i).t >= order(i).ovr THEN
  539.                     SendFleet order(i).src, order(i).dst, order(i).shp
  540.                 END IF
  541.             END IF
  542.         END IF
  543.     NEXT
  544.  
  545.     FOR i = 0 TO 99
  546.         c = star(i).c
  547.         x = star(i).x
  548.         y = star(i).y
  549.         o = star(i).o
  550.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  551.         COLOR 15
  552.         IF o > 0 THEN
  553.             PAINT (x, y), colors(o), c
  554.         END IF
  555.         _FONT ttf16
  556.         IF tt THEN
  557.             n$ = star(i).n
  558.             n$ = RTRIM$(n$)
  559.             l = _PRINTWIDTH(n$)
  560.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  561.         ELSE
  562.             n$ = STR$(star(i).t)
  563.             l = _PRINTWIDTH(n$)
  564.         END IF
  565.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  566.     NEXT
  567.  
  568.  
  569. SUB Player
  570.  
  571.     ' Custom Map Mode
  572.     IF cm = 1 THEN
  573.         IF lmb THEN
  574.             i = Identify
  575.             IF i < 100 THEN
  576.                 WHILE _MOUSEINPUT: WEND
  577.                 nx = _MOUSEX
  578.                 ny = _MOUSEY
  579.                 ok = 1
  580.                 FOR j = 0 TO 99
  581.                     IF j <> i THEN
  582.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  583.                         IF dist <= 60 THEN
  584.                             ok = 0
  585.                             EXIT FOR
  586.                         END IF
  587.                     END IF
  588.                 NEXT
  589.                 IF ok = 1 THEN
  590.                     star(i).x = nx
  591.                     star(i).y = ny
  592.                 ELSE
  593.                     _MOUSEMOVE star(i).x, star(i).y
  594.                 END IF
  595.             END IF
  596.         END IF
  597.     END IF
  598.  
  599.     'Add new order to standing orders
  600.     IF ord.src <> 100 THEN
  601.         i = ord.src
  602.         IF ord.shp = 0 THEN
  603.             order(i).src = 100
  604.         ELSE
  605.             order(i) = ord
  606.         END IF
  607.         src = 100
  608.         ord.src = 100
  609.     END IF
  610.  
  611.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  612.  
  613.         'If there is no source star see if we can get one
  614.         IF src = 100 AND cm = 0 THEN
  615.             i = Identify
  616.             IF i < 100 THEN WorldPanel i
  617.             IF lclk = 1 OR rclk = 1 THEN
  618.                 lclk = 0
  619.                 rclk = 0
  620.                 src = i
  621.             END IF
  622.         END IF
  623.  
  624.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  625.         IF src <> 100 THEN
  626.             c = 12
  627.             FOR i = 0 TO 99
  628.                 IF star(i).o = 1 THEN
  629.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  630.                     IF dist <= 251 * ratio THEN
  631.                         c = 10
  632.                         EXIT FOR
  633.                     END IF
  634.                 END IF
  635.             NEXT
  636.             i = Identify
  637.             IF i <> 100 THEN
  638.                 x = star(i).x
  639.                 y = star(i).y
  640.             END IF
  641.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  642.             LINE (star(src).x, star(src).y)-(x, y), c
  643.             n$ = STR$(INT(rang))
  644.             _FONT ttf16
  645.             _PRINTSTRING (x + 20, y), n$, 0
  646.         END IF
  647.  
  648.         'If we have a source star see if we clicked on a destination star
  649.         IF src <> 100 THEN
  650.             IF lclk = 1 OR rclk = 1 THEN
  651.                 i = Identify
  652.                 IF i = src THEN
  653.                     lclk = 0
  654.                     src = 100
  655.                     IF rclk = 1 THEN
  656.                         rclk = 0
  657.                         order(i).src = 100
  658.                     END IF
  659.                 ELSE
  660.                     IF i < 100 AND i <> src THEN
  661.                         IF lclk = 1 THEN
  662.                             lclk = 0
  663.                             FOR j = 0 TO 99
  664.                                 IF star(j).o = 1 THEN
  665.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  666.                                     IF dist <= 250 THEN
  667.                                         dst = i
  668.                                         pact = 1
  669.                                         EXIT FOR
  670.                                     END IF
  671.                                 END IF
  672.                             NEXT
  673.                         ELSE
  674.                             rclk = 0
  675.                             dst = i
  676.                             IF star(i).o = 1 THEN
  677.                                 oact = 1
  678.                             END IF
  679.                         END IF
  680.                     END IF
  681.                 END IF
  682.             END IF
  683.         END IF
  684.     END IF
  685.  
  686.     'If the game panel is active
  687.     IF gact = 1 THEN
  688.         GamePanel
  689.         IF lclk = 1 THEN
  690.             x1 = sw / 4 + 910: x2 = x1 + 40: y1 = sh / 4 + 10: y2 = y1 + 40
  691.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  692.                 ch = CHR$(27)
  693.             END IF
  694.             FOR i = 143 TO 874 STEP 81
  695.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  696.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  697.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  698.                     SaveGame n$
  699.                 END IF
  700.                 y1 = y1 + 60: y2 = y2 + 60
  701.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  702.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  703.                     LoadGame n$
  704.                 END IF
  705.             NEXT
  706.             _FONT ttf36
  707.             l2 = 0
  708.             l1 = _PRINTWIDTH("Custom Mode")
  709.             IF fltcnt = 0 THEN
  710.                 x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  711.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  712.                     cm = 1 - cm
  713.                 END IF
  714.             END IF
  715.             l2 = l1
  716.             l1 = _PRINTWIDTH("Demo Mode")
  717.             x1 = 76 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  718.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  719.                 dm = 1 - dm
  720.                 IF dm = 0 THEN
  721.                     ncp = 5
  722.                     bmp = 2
  723.                 ELSE
  724.                     ncp = 6
  725.                     bmp = 1
  726.                 END IF
  727.             END IF
  728.             l2 = l2 + l1
  729.             l1 = _PRINTWIDTH("Rectangle")
  730.             x1 = 112 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  731.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  732.                 rm = 1 - rm
  733.             END IF
  734.             l2 = l2 + l1
  735.             l1 = _PRINTWIDTH("New Game")
  736.             x1 = 148 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  737.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  738.                 gact = 0
  739.                 NewGame
  740.             END IF
  741.             l1 = _PRINTWIDTH("Play a Duel")
  742.             x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 310 + sh / 4: y2 = y1 + 60
  743.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  744.                 gact = 0
  745.                 duel = 1
  746.                 NewGame
  747.             END IF
  748.             FOR i = 134 TO 874 STEP 134
  749.                 j = j + 1
  750.                 x1 = sw / 4 + i: x2 = x1 + 124: y1 = sh / 4 + 386: y2 = y1 + 60
  751.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  752.                     tmp = colors(1)
  753.                     colors(1) = colors(j)
  754.                     colors(j) = tmp
  755.                 END IF
  756.             NEXT
  757.         END IF
  758.     END IF
  759.  
  760.     'If the star standing orders panel is active
  761.     IF oact = 1 THEN
  762.  
  763.         IF star(src).o = 1 THEN
  764.             OrderPanel dst
  765.         END IF
  766.  
  767.         IF rclk = 1 THEN oact = 0
  768.  
  769.         IF box = 0 THEN
  770.             tmp$ = RTRIM$(strng0)
  771.         ELSE
  772.             tmp$ = RTRIM$(strng1)
  773.         END IF
  774.  
  775.         IF lclk = 1 THEN
  776.  
  777.             x1 = oanx: x2 = oanx + 400 * ratio
  778.             y1 = oany: y2 = oany + 540 * ratio
  779.  
  780.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  781.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  782.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  783.                     IF box = 0 THEN
  784.                         n$ = RTRIM$(strng0)
  785.                         l = LEN(n$)
  786.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  787.                     ELSE
  788.                         n$ = RTRIM$(strng1)
  789.                         l = LEN(n$)
  790.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  791.                     END IF
  792.                 END IF
  793.             END IF
  794.  
  795.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  796.  
  797.                 IF box = 0 THEN
  798.  
  799.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  800.                         ord.ovr = INT(VAL(strng0))
  801.                         box = 1
  802.                     END IF
  803.  
  804.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  805.                         strng0 = ""
  806.                     END IF
  807.  
  808.                 ELSE
  809.  
  810.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  811.                         IF INT(VAL(strng1)) > ord.ovr THEN
  812.                             strng1 = ""
  813.                         ELSE
  814.                             box = 0
  815.                             oact = 0
  816.                             ord.src = src
  817.                             ord.dst = dst
  818.                             ord.shp = VAL(strng1)
  819.                             strng0 = ""
  820.                             strng1 = ""
  821.                         END IF
  822.                     END IF
  823.  
  824.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  825.                         strng0 = ""
  826.                         strng1 = ""
  827.                         box = 0
  828.                     END IF
  829.  
  830.                 END IF
  831.  
  832.             END IF
  833.         END IF
  834.         x1 = 10000: y1 = 10000
  835.  
  836.     END IF
  837.  
  838.  
  839.     'If the fleet send panel is active
  840.     IF pact = 1 THEN
  841.         IF rclk = 1 THEN pact = 0
  842.         IF star(src).o = 1 THEN
  843.             ShowPanel dst
  844.         END IF
  845.         IF lclk = 1 THEN
  846.             tmp$ = RTRIM$(strng)
  847.  
  848.             x1 = panx: x2 = panx + 400 * ratio
  849.             y1 = pany: y2 = pany + 540 * ratio
  850.  
  851.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  852.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  853.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  854.                     strng = tmp$ + STR$(dig)
  855.                 END IF
  856.             END IF
  857.  
  858.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  859.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  860.                     pact = 0
  861.                     value = star(src).t
  862.                     SendFleet src, dst, value
  863.                     src = 100
  864.                 END IF
  865.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  866.                     pact = 0
  867.                     value = star(src).t / 2
  868.                     SendFleet src, dst, value
  869.                     src = 100
  870.                 END IF
  871.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  872.                     pact = 0
  873.                     value = star(src).t / 3
  874.                     SendFleet src, dst, value
  875.                     src = 100
  876.                 END IF
  877.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  878.                     strng = ""
  879.                 END IF
  880.             END IF
  881.  
  882.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  883.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  884.                     value = VAL(strng)
  885.                     strng = ""
  886.                     pact = 0
  887.                     IF value <= star(src).t AND star(src).t <> o THEN
  888.                         SendFleet src, dst, value
  889.                     END IF
  890.                     src = 100
  891.                 END IF
  892.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  893.                     pact = 0
  894.                     src = 100
  895.                     strng = ""
  896.                 END IF
  897.             END IF
  898.         END IF
  899.     END IF
  900.  
  901. SUB QuickSave
  902.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  903.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  904.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  905.     qfltcnt = fltcnt
  906.     qLL = LL
  907.  
  908. SUB QuickRestore
  909.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  910.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  911.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  912.     fltcnt = qfltcnt
  913.     LL = qLL
  914.     paused = 1
  915.  
  916. SUB LoadGame (n$)
  917.     n$ = n$ + ".sav"
  918.     IF _FILEEXISTS(n$) THEN
  919.         OPEN n$ FOR BINARY AS #2
  920.         GET #2, , star()
  921.         GET #2, , order()
  922.         GET #2, , fleet()
  923.         GET #2, , home()
  924.         GET #2, , fltcnt
  925.         GET #2, , LL
  926.         CLOSE #2
  927.         PRINT "Game Loaded"
  928.         dm = 0
  929.         cm = 0
  930.         ncp = 5
  931.         bmp = 2
  932.         it = 0
  933.     END IF
  934.  
  935. SUB SaveGame (n$)
  936.     n$ = n$ + ".sav"
  937.     OPEN n$ FOR BINARY AS #1
  938.     CLOSE #1
  939.     KILL n$
  940.     OPEN n$ FOR BINARY AS #1
  941.     PUT #1, , star()
  942.     PUT #1, , order()
  943.     PUT #1, , fleet()
  944.     PUT #1, , home()
  945.     PUT #1, , fltcnt
  946.     PUT #1, , LL
  947.     CLOSE #1
  948.     PRINT "Game Saved"
  949.  
  950. SUB SendFleet (src, dst, ships)
  951.     IF fltcnt < 2000 THEN
  952.         FOR i = 0 TO 1999
  953.             IF fleet(i).o = 0 THEN
  954.                 fleet(i).o = star(src).o
  955.                 fleet(i).d = dst
  956.                 fleet(i).x1 = star(src).x
  957.                 fleet(i).y1 = star(src).y
  958.                 fleet(i).x2 = star(dst).x
  959.                 fleet(i).y2 = star(dst).y
  960.                 fleet(i).t = ships
  961.                 star(src).t = star(src).t - ships
  962.                 fltcnt = fltcnt + 1
  963.                 EXIT FOR
  964.             END IF
  965.         NEXT
  966.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  967.     END IF
  968.  
  969. SUB ShowPanel (i)
  970.     x1 = star(i).x - 420 * ratio
  971.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  972.     x2 = x1 + 400 * ratio
  973.     y1 = star(i).y
  974.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  975.     y2 = y1 + 540 * ratio
  976.     _DEST sp
  977.     CLS 0, 8
  978.     COLOR 0, 8
  979.     _FONT ttf72
  980.     n$ = RTRIM$(star(src).n)
  981.     l = _PRINTWIDTH(n$)
  982.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  983.     n$ = "to"
  984.     l = _PRINTWIDTH(n$)
  985.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  986.     n$ = RTRIM$(star(dst).n)
  987.     l = _PRINTWIDTH(n$)
  988.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  989.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  990.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  991.     n$ = RTRIM$(strng)
  992.     l = _PRINTWIDTH(n$)
  993.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  994.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  995.     LINE (xo, yo)-(xd, yd), 7, BF
  996.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  997.     LINE (xo, yo)-(xd, yd), 7, BF
  998.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  999.     LINE (xo, yo)-(xd, yd), 7, BF
  1000.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  1001.     LINE (xo, yo)-(xd, yd), 7, BF
  1002.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  1003.     LINE (xo, yo)-(xd, yd), 7, BF
  1004.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  1005.     LINE (xo, yo)-(xd, yd), 7, BF
  1006.     _FONT ttf24
  1007.     COLOR 7, 8
  1008.     n$ = RTRIM$(STR$(star(src).t))
  1009.     l = _PRINTWIDTH(n$)
  1010.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  1011.     n$ = RTRIM$(STR$(star(dst).t))
  1012.     l = _PRINTWIDTH(n$)
  1013.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  1014.     _FONT ttf16
  1015.     COLOR 0, 7
  1016.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  1017.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  1018.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  1019.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  1020.     _FONT ttf72
  1021.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  1022.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  1023.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  1024.     panx = x1: pany = y1
  1025.     _DEST 0
  1026.  
  1027. SUB Update
  1028.     IF paused = 0 THEN
  1029.         RANDOMIZE TIMER
  1030.         FOR i = 0 TO 99
  1031.             r = INT(RND * 60)
  1032.             IF r < star(i).p THEN
  1033.                 IF star(i).o > 0 THEN
  1034.                     star(i).t = star(i).t + 1
  1035.                 ELSE
  1036.                     IF INT(RND * 10) < 3 THEN
  1037.                         star(i).t = star(i).t + 1
  1038.                     END IF
  1039.                 END IF
  1040.             END IF
  1041.         NEXT
  1042.  
  1043.         count = fltcnt
  1044.         i = 0
  1045.         WHILE count
  1046.             IF fleet(i).o <> 0 THEN
  1047.                 count = count - 1
  1048.                 IF fleet(i).x2 > fleet(i).x1 THEN
  1049.                     fleet(i).x1 = fleet(i).x1 + 1
  1050.                 END IF
  1051.                 IF fleet(i).x2 < fleet(i).x1 THEN
  1052.                     fleet(i).x1 = fleet(i).x1 - 1
  1053.                 END IF
  1054.                 IF fleet(i).y2 > fleet(i).y1 THEN
  1055.                     fleet(i).y1 = fleet(i).y1 + 1
  1056.                 END IF
  1057.                 IF fleet(i).y2 < fleet(i).y1 THEN
  1058.                     fleet(i).y1 = fleet(i).y1 - 1
  1059.                 END IF
  1060.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  1061.                     dest = fleet(i).d
  1062.                     IF star(dest).o = fleet(i).o THEN
  1063.                         star(dest).t = star(dest).t + fleet(i).t
  1064.                         fleet(i).o = 0
  1065.                         fltcnt = fltcnt - 1
  1066.                     ELSE
  1067.                         o = star(dest).o
  1068.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  1069.                             k = 100
  1070.                             shortest = 10000
  1071.                             FOR j = 0 TO 99
  1072.                                 IF star(j).o = o THEN
  1073.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  1074.                                     IF dist < shortest THEN
  1075.                                         shortest = dist
  1076.                                         k = j
  1077.                                     END IF
  1078.                                 END IF
  1079.                             NEXT
  1080.                             SendFleet dest, k, star(dest).t * 0.90
  1081.                             star(dest).t = 0
  1082.                             star(dest).o = fleet(i).o
  1083.                             star(dest).t = fleet(i).t
  1084.                             star(dest).o = fleet(i).o
  1085.                             fleet(i).o = 0
  1086.                             fltcnt = fltcnt - 1
  1087.                         ELSE
  1088.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  1089.                                 alive = 1
  1090.                                 WHILE alive
  1091.                                     alive = 0
  1092.                                     damorg = fleet(i).t / 10 + 1
  1093.                                     damdst = star(dest).t / 8 + 1
  1094.                                     fleet(i).t = fleet(i).t - damdst
  1095.                                     star(dest).t = star(dest).t - damorg
  1096.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  1097.                                         alive = 1
  1098.                                     END IF
  1099.                                 WEND
  1100.                                 IF star(dest).t < 1 THEN
  1101.                                     star(dest).t = fleet(i).t
  1102.                                     star(dest).o = fleet(i).o
  1103.                                 END IF
  1104.                                 fleet(i).o = 0
  1105.                                 fltcnt = fltcnt - 1
  1106.                             ELSE
  1107.                                 k = 100
  1108.                                 shortest = 10000
  1109.                                 FOR j = 0 TO 99
  1110.                                     IF star(j).o = fleet(i).o THEN
  1111.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1112.                                         IF dist < shortest THEN
  1113.                                             shortest = dist
  1114.                                             k = j
  1115.                                         END IF
  1116.                                     END IF
  1117.                                 NEXT
  1118.                                 IF k < 100 THEN
  1119.                                     fleet(i).x2 = star(k).x
  1120.                                     fleet(i).y2 = star(k).y
  1121.                                     fleet(i).d = k
  1122.                                 ELSE
  1123.                                     fleet(i).o = 0
  1124.                                     fltcnt = fltcnt - 1
  1125.                                 END IF
  1126.                             END IF
  1127.                         END IF
  1128.                     END IF
  1129.                 END IF
  1130.             END IF
  1131.             i = i + 1
  1132.         WEND
  1133.     END IF
  1134.  
  1135. SUB WorldPanel (i)
  1136.     x1 = star(i).x - 420 * ratio
  1137.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1138.     x2 = x1 + 400 * ratio
  1139.     y1 = star(i).y
  1140.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1141.     y2 = y1 + 225 * ratio
  1142.     _DEST wp
  1143.     CLS 0, 8
  1144.     COLOR 0, 8
  1145.     _FONT ttf72
  1146.     n$ = RTRIM$(star(i).n)
  1147.     l = _PRINTWIDTH(n$)
  1148.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1149.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1150.     COLOR 7, 8
  1151.     _FONT ttf36
  1152.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1153.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1154.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1155.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1156.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1157.     n$ = "NO"
  1158.     FOR j = 0 TO 99
  1159.         IF star(i).o <> star(j).o THEN
  1160.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1161.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1162.                 IF dist <= 250 THEN
  1163.                     n$ = "YES"
  1164.                     EXIT FOR
  1165.                 END IF
  1166.             END IF
  1167.         END IF
  1168.     NEXT
  1169.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1170.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1171.     _DEST 0
  1172.  
  1173. SUB NewGame
  1174.     DIM k AS INTEGER
  1175.     DIM r AS INTEGER
  1176.     DIM dx AS INTEGER
  1177.     DIM dy AS INTEGER
  1178.     DIM n AS STRING * 10
  1179.     DIM low AS LONG
  1180.     DIM high AS LONG
  1181.     DIM tot AS LONG
  1182.     paused = 1
  1183.     FOR i = 0 TO 999
  1184.         fleet(i).o = 0
  1185.     NEXT
  1186.     slct = 0
  1187.     fltcnt = 0
  1188.     LL = 0
  1189.     seed = RND * 1000
  1190.     FOR i = 0 TO 99
  1191.         k = 1
  1192.         WHILE k
  1193.             k = 0
  1194.             ok = 0
  1195.             DO
  1196.                 x = RND * (sw - sww) + swn
  1197.                 y = RND * (sh - shw) + shn
  1198.                 ok = -1
  1199.                 IF rm = 1 AND x > sw / 4 AND x < sw - sw / 4 AND y > sh / 4 AND y < sh - sh / 4 THEN ok = 0
  1200.             LOOP UNTIL ok
  1201.             r = INT(RND * 200)
  1202.             n = names(r)
  1203.             FOR j = 0 TO i - 1
  1204.                 dx = x - star(j).x
  1205.                 dy = y - star(j).y
  1206.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1207.                     k = 1
  1208.                 END IF
  1209.                 IF n = star(j).n THEN
  1210.                     k = 1
  1211.                 END IF
  1212.             NEXT
  1213.         WEND
  1214.         star(i).n = n
  1215.         star(i).x = x
  1216.         star(i).y = y
  1217.         star(i).c = RND * 6 + 9
  1218.         star(i).s = RND * 5
  1219.         star(i).o = 0
  1220.         star(i).p = star(i).s + (RND * 5) + 3
  1221.         star(i).t = 0
  1222.         order(i).src = 100
  1223.     NEXT
  1224.     low = 10000000
  1225.     high = 0
  1226.     IF duel = 1 THEN
  1227.         FOR j = 0 TO 99
  1228.             x = star(j).x
  1229.             y = star(j).y
  1230.             tot = x * y
  1231.             IF tot < low THEN
  1232.                 low = tot
  1233.                 a = j
  1234.             END IF
  1235.             IF tot > high THEN
  1236.                 high = tot
  1237.                 b = j
  1238.             END IF
  1239.         NEXT
  1240.         home(1) = a
  1241.         star(a).o = 1
  1242.         star(a).p = 10
  1243.         star(a).t = 100
  1244.         star(a).s = 4
  1245.         star(a).n = "Sol"
  1246.         star(a).c = 14
  1247.  
  1248.         home(2) = b
  1249.         star(b).o = 2
  1250.         star(b).p = 10
  1251.         star(b).t = 100
  1252.         star(b).s = 4
  1253.     ELSE
  1254.         FOR i = 1 TO 6
  1255.             ok = 0
  1256.             WHILE (ok < 1)
  1257.                 ok = 1
  1258.                 j = RND * 100
  1259.                 FOR k = 1 TO i - 1
  1260.                     dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1261.                     IF dist < 500 * ratio THEN
  1262.                         ok = 0
  1263.                         EXIT FOR
  1264.                     END IF
  1265.                 NEXT
  1266.                 IF ok = 1 THEN
  1267.                     ok = -1
  1268.                     FOR k = 0 TO 99
  1269.                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1270.                         IF dist <= 200 THEN ok = ok + 1
  1271.                         IF ok = 2 THEN EXIT FOR
  1272.                     NEXT
  1273.                 END IF
  1274.             WEND
  1275.             home(i) = j
  1276.             star(j).o = i
  1277.             star(j).p = 10
  1278.             star(j).t = 100
  1279.             star(j).s = 4
  1280.             colors(i) = i + 8
  1281.         NEXT
  1282.     END IF
  1283.     star(home(1)).n = "Sol"
  1284.     star(home(1)).c = 14
  1285.     ncp = 5
  1286.     bmp = 2
  1287.     dm = 0
  1288.     speed = 0
  1289.     QuickSave
  1290.  
  1291. ' A lot of star names I made up
  1292.  
  1293. SUB StarNames
  1294.     names(0) = "Acamar"
  1295.     names(1) = "Arcab"
  1296.     names(2) = "Acrux"
  1297.     names(3) = "Adhara"
  1298.     names(4) = "Arneb"
  1299.     names(5) = "Antares"
  1300.     names(6) = "Arcturus"
  1301.     names(7) = "Atria"
  1302.     names(8) = "Beid"
  1303.     names(9) = "Betelgeuse"
  1304.     names(10) = "Botein"
  1305.     names(11) = "Beemim"
  1306.     names(12) = "Bellatrix"
  1307.     names(13) = "Bharani"
  1308.     names(14) = "Biham"
  1309.     names(15) = "Brachium"
  1310.     names(16) = "Canopus"
  1311.     names(17) = "Capella"
  1312.     names(18) = "Castor"
  1313.     names(19) = "Chara"
  1314.     names(20) = "Cursa"
  1315.     names(21) = "Copernicus"
  1316.     names(22) = "Chalawan"
  1317.     names(23) = "Chertan"
  1318.     names(24) = "Dabih"
  1319.     names(25) = "Dalim"
  1320.     names(26) = "Deneb"
  1321.     names(27) = "Denebola"
  1322.     names(28) = "Diadem"
  1323.     names(29) = "Diphda"
  1324.     names(30) = "Dschubba"
  1325.     names(31) = "Dziban"
  1326.     names(32) = "Edasich"
  1327.     names(33) = "Electra"
  1328.     names(34) = "Elgafar"
  1329.     names(35) = "Elkurud"
  1330.     names(36) = "Elnath"
  1331.     names(37) = "Eltanin"
  1332.     names(38) = "Enif"
  1333.     names(39) = "Errai"
  1334.     names(40) = "Fafnir"
  1335.     names(41) = "Fang"
  1336.     names(42) = "Fawaris"
  1337.     names(43) = "Felis"
  1338.     names(44) = "Fomalhaut"
  1339.     names(45) = "Fulu"
  1340.     names(46) = "Fumal"
  1341.     names(47) = "Furud"
  1342.     names(48) = "Garnet"
  1343.     names(49) = "Giausar"
  1344.     names(50) = "Gienah"
  1345.     names(51) = "Ginan"
  1346.     names(52) = "Gomeisa"
  1347.     names(53) = "Graffias"
  1348.     names(54) = "Grumium"
  1349.     names(55) = "Gudja"
  1350.     names(56) = "Hadar"
  1351.     names(57) = "Haedus"
  1352.     names(58) = "Hamal"
  1353.     names(59) = "Hassaleh"
  1354.     names(60) = "Hatysa"
  1355.     names(61) = "Helvetios"
  1356.     names(62) = "Heze"
  1357.     names(63) = "Homan"
  1358.     names(64) = "Iklil"
  1359.     names(65) = "Imai"
  1360.     names(66) = "Intercrus"
  1361.     names(67) = "Izar"
  1362.     names(68) = "Iccar"
  1363.     names(69) = "Inar"
  1364.     names(70) = "Iaeth"
  1365.     names(71) = "Imaous"
  1366.     names(72) = "Jabbah"
  1367.     names(73) = "Jishui"
  1368.     names(74) = "Jax"
  1369.     names(75) = "Jalae"
  1370.     names(76) = "Jewel"
  1371.     names(77) = "Jumbo"
  1372.     names(78) = "Jerue"
  1373.     names(79) = "Jabear"
  1374.     names(80) = "Kakkab"
  1375.     names(81) = "Kang"
  1376.     names(82) = "Kekouan"
  1377.     names(83) = "Keid"
  1378.     names(84) = "Kitalpha"
  1379.     names(85) = "Kochab"
  1380.     names(86) = "Kolob"
  1381.     names(87) = "Kobol"
  1382.     names(88) = "Larawag"
  1383.     names(89) = "Lesath"
  1384.     names(90) = "Libertas"
  1385.     names(91) = "Lich"
  1386.     names(92) = "Lilly"
  1387.     names(93) = "Laddel"
  1388.     names(94) = "Luminous"
  1389.     names(95) = "Lasacious"
  1390.     names(96) = "Mizar"
  1391.     names(97) = "Markab"
  1392.     names(98) = "Matar"
  1393.     names(99) = "Mintaka"
  1394.     names(100) = "Meleph"
  1395.     names(101) = "Menkar"
  1396.     names(102) = "Merga"
  1397.     names(103) = "Merope"
  1398.     names(104) = "Nahn"
  1399.     names(105) = "Naos"
  1400.     names(106) = "Nashira"
  1401.     names(107) = "Navi"
  1402.     names(108) = "Nekkar"
  1403.     names(109) = "Nembus"
  1404.     names(110) = "Nihal"
  1405.     names(111) = "Nunki"
  1406.     names(112) = "Ogma"
  1407.     names(113) = "Okab"
  1408.     names(114) = "Ohmy"
  1409.     names(115) = "Oragami"
  1410.     names(116) = "Origen"
  1411.     names(117) = "Omanii"
  1412.     names(118) = "Obytewa"
  1413.     names(119) = "Oglok"
  1414.     names(120) = "Phact"
  1415.     names(121) = "Pherkad"
  1416.     names(122) = "Pleione"
  1417.     names(122) = "Polaris"
  1418.     names(123) = "Pollux"
  1419.     names(124) = "Procyon"
  1420.     names(125) = "Proxima"
  1421.     names(126) = "Polis"
  1422.     names(127) = "Quaint"
  1423.     names(128) = "QB64"
  1424.     names(129) = "Quetzal"
  1425.     names(130) = "Qussol"
  1426.     names(131) = "Quella"
  1427.     names(132) = "Quyaeo"
  1428.     names(133) = "Ququdas"
  1429.     names(134) = "Quekak"
  1430.     names(135) = "Rasalas"
  1431.     names(136) = "Regor"
  1432.     names(137) = "Regulus"
  1433.     names(138) = "Rigel"
  1434.     names(139) = "Revati"
  1435.     names(140) = "Rotenev"
  1436.     names(141) = "Rukbat"
  1437.     names(142) = "Rastaban"
  1438.     names(143) = "Sabik"
  1439.     names(144) = "Sadr"
  1440.     names(145) = "Saiph"
  1441.     names(146) = "Sargas"
  1442.     names(147) = "Sarin"
  1443.     names(148) = "Syrma"
  1444.     names(149) = "Spica"
  1445.     names(150) = "Sirius"
  1446.     names(151) = "Tarazed"
  1447.     names(152) = "Taygeta"
  1448.     names(153) = "Tejat"
  1449.     names(154) = "Thabit"
  1450.     names(155) = "Thuban"
  1451.     names(156) = "Tiaki"
  1452.     names(157) = "Toliman"
  1453.     names(158) = "Torcular"
  1454.     names(157) = "Umala"
  1455.     names(158) = "Ulatte"
  1456.     names(159) = "Ubbessa"
  1457.     names(160) = "Unoless"
  1458.     names(161) = "Umaddem"
  1459.     names(162) = "Ummbra"
  1460.     names(162) = "Uniqu"
  1461.     names(163) = "Uzzaal"
  1462.     names(164) = "Vega"
  1463.     names(165) = "Veritate"
  1464.     names(166) = "Vindetrix"
  1465.     names(167) = "Vedas"
  1466.     names(168) = "Vergg"
  1467.     names(169) = "Vacant"
  1468.     names(170) = "Vucae"
  1469.     names(171) = "Vicar"
  1470.     names(172) = "Wasat"
  1471.     names(173) = "Wazn"
  1472.     names(174) = "Wezen"
  1473.     names(175) = "Waiten"
  1474.     names(176) = "Wachar"
  1475.     names(177) = "Wheelz"
  1476.     names(178) = "Whatsp"
  1477.     names(179) = "Wassand"
  1478.     names(180) = "Xenno"
  1479.     names(181) = "Xyphod"
  1480.     names(182) = "Xu"
  1481.     names(183) = "Xaal"
  1482.     names(184) = "Xyross"
  1483.     names(185) = "Xiggot"
  1484.     names(186) = "Xirrks"
  1485.     names(187) = "Yed"
  1486.     names(188) = "Yildun"
  1487.     names(189) = "Yundun"
  1488.     names(190) = "Yavyo"
  1489.     names(191) = "Yotrac"
  1490.     names(192) = "Yxzoqu"
  1491.     names(193) = "Ynnot"
  1492.     names(194) = "Zaniah"
  1493.     names(195) = "Zaurak"
  1494.     names(196) = "Zhang"
  1495.     names(197) = "Zibal"
  1496.     names(198) = "Zosma"
  1497.     names(199) = "Zuben"
  1498.  
  1499.  
  1500.  
My name is Michael, but you can call me Mike :)

Offline romichess

  • Forum Regular
  • Posts: 145
    • View Profile
Re: Beyond The Stars (alpha)
« Reply #14 on: January 27, 2020, 02:08:07 am »
Added some more options to the game panel.
WARNING: Previous saved games will crash the program - delete them.

Code: QB64: [Select]
  1. TYPE stars
  2.     n AS STRING * 10 '                 Name of star
  3.     x AS INTEGER '                     x-position
  4.     y AS INTEGER '                     y-position
  5.     o AS INTEGER '                     Owner
  6.     c AS INTEGER '                     Color
  7.     s AS INTEGER '                     Size
  8.     t AS LONG '                        Ships
  9.     p AS INTEGER '
  10.     d AS INTEGER '                   (Population) For now ships production
  11.  
  12. TYPE FLEETS
  13.     t AS LONG
  14.     x1 AS INTEGER
  15.     y1 AS INTEGER
  16.     x2 AS INTEGER
  17.     y2 AS INTEGER
  18.     o AS INTEGER
  19.     d AS INTEGER
  20.  
  21. TYPE ORDERS
  22.     src AS LONG
  23.     ovr AS LONG
  24.     shp AS LONG
  25.     dst AS LONG
  26.  
  27. ' Global variables shared because they are needed in more than one routine
  28. DIM SHARED sw AS INTEGER '             Screen Width
  29. DIM SHARED sh AS INTEGER '             Screen Height
  30. DIM SHARED sww AS INTEGER '            Screen Width Wide margin
  31. DIM SHARED swn AS INTEGER '            Screen Width Narrow adjustment
  32. DIM SHARED shw AS INTEGER '            Screen Height Wide margine
  33. DIM SHARED shn AS INTEGER '            Screen Height Narrow adjustment
  34. DIM SHARED nw AS INTEGER '             games Natural screen Width
  35. DIM SHARED nh AS INTEGER '             games Natural screen Height
  36. DIM SHARED ratio AS _FLOAT '           the Ratio of the games natural screen width to the actual
  37. DIM SHARED star(100) AS stars '        100 stars - may change
  38. DIM SHARED qstar(100) AS stars
  39. DIM SHARED names(200) AS STRING * 10 ' 200 star names
  40. DIM SHARED seed AS INTEGER '           Seed to prime the Randomizer to display identical background each frame
  41. DIM SHARED home(7) AS INTEGER '        The starting star for each player. The human always has star(0), Sol
  42. DIM SHARED qhome(7) AS INTEGER
  43. DIM SHARED tt AS INTEGER '             tt = 0 star names displayed, tt = 0 star names not didplayed
  44. DIM SHARED ch AS STRING * 1 '          Game loop key input variable
  45. DIM SHARED repeat AS INTEGER '         Game loop control variable
  46. DIM SHARED fleet(2000) AS FLEETS
  47. DIM SHARED qfleet(2000) AS FLEETS
  48. DIM SHARED panx, pany AS INTEGER
  49. DIM SHARED oanx, oany AS INTEGER
  50. DIM SHARED strng AS STRING * 14
  51. DIM SHARED strng0 AS STRING * 10
  52. DIM SHARED strng1 AS STRING * 10
  53. DIM SHARED order(100) AS ORDERS
  54. DIM SHARED qorder(100) AS ORDERS
  55. DIM SHARED ord AS ORDERS
  56. DIM SHARED colors(7) AS INTEGER
  57.  
  58. sw = _DESKTOPWIDTH '                   native video with of syatem
  59. sww = sw / 24 '                        margin based on native video width to keep stars away from edge
  60. swn = sw / 48 '                        adjustment that works with sww to keep stars away from left and top of screen
  61. nw = 1920
  62.  
  63. ratio = sw / 1920 '                    Used to adjust distances and sizes for various screen modes
  64.  
  65. shw = sh / 20
  66. shn = sh / 40
  67. nh = 1080
  68.  
  69. tt = 0
  70. lcx = sw
  71. rcx = sw
  72. cp = 100
  73. h = 100
  74. ar = 0
  75. rng = 200
  76. slct = 0
  77. strng = ""
  78. strng0 = ""
  79. strng1 = ""
  80. src = 100
  81. dst = 100
  82. ord.src = 100
  83. ncp = 5
  84. bmp = 2
  85. gact = 1
  86.  
  87. SCREEN _NEWIMAGE(sw, sh, 256) '        creates a screen the resolution of the users native system
  88.  
  89.  
  90. wp = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  91. sp = _NEWIMAGE(400 * ratio, 540 * ratio, 256)
  92. op = _NEWIMAGE(400 * ratio, 225 * ratio, 256)
  93. gp = _NEWIMAGE(960 * ratio, 540 * ratio, 256)
  94.  
  95. StarNames
  96.  
  97. ttf16 = _LOADFONT("cyberbit.ttf", 16 * ratio, "BOLD")
  98. ttf24 = _LOADFONT("cyberbit.ttf", 24 * ratio, "BOLD")
  99. ttf36 = _LOADFONT("cyberbit.ttf", 36 * ratio, "BOLD")
  100. ttf72 = _LOADFONT("cyberbit.ttf", 72 * ratio, "BOLD")
  101.  
  102. NewGame
  103.  
  104. IF _FILEEXISTS("savegame.sav") THEN
  105.     LoadGame "savegame"
  106.     gact = 0
  107.  
  108. repeat = 1
  109.  
  110. WHILE repeat
  111.  
  112.     CLS
  113.  
  114.     PaintBackground
  115.  
  116.     PaintStars
  117.  
  118.     PaintFleet
  119.  
  120.     FOR it = 0 TO speed
  121.  
  122.         Update
  123.  
  124.         GetInput
  125.  
  126.         Player
  127.  
  128.     NEXT
  129.  
  130.     Computer
  131.  
  132.     _DISPLAY
  133.  
  134.  
  135.  
  136. SUB Computer
  137.  
  138.     IF paused = 0 THEN
  139.         id = INT(RND * ncp) + bmp
  140.         i = home(id)
  141.         IF star(i).o <> id THEN
  142.             FOR j = 0 TO 99
  143.                 IF star(j).o = id THEN home(id) = j: i = j: EXIT FOR
  144.             NEXT
  145.         END IF
  146.  
  147.         FOR p = 0 TO 3
  148.  
  149.             IF p = 0 THEN
  150.                 IF star(i).t > LL THEN
  151.                     away = 10000
  152.                     FOR j = 0 TO 99
  153.                         IF star(j).o <> id THEN
  154.                             dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  155.                             IF dist < away THEN
  156.                                 away = dist
  157.                                 o = star(j).o
  158.                             END IF
  159.                         END IF
  160.                     NEXT
  161.                     away1 = 10000
  162.                     away2 = 10000
  163.                     jay1 = 100
  164.                     jay2 = 100
  165.                     FOR j = 0 TO 99
  166.                         IF star(j).o = o THEN
  167.                             IF star(j).d > 0 THEN
  168.                                 star(j).d = star(j).d - 1
  169.                             ELSE
  170.                                 ok = 0
  171.                                 FOR k = 0 TO 99
  172.                                     IF star(k).o = id THEN
  173.                                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  174.                                         IF dist <= 250 THEN
  175.                                             ok = 1
  176.                                             EXIT FOR
  177.                                         END IF
  178.                                     END IF
  179.                                 NEXT
  180.                                 IF ok = 1 THEN
  181.                                     dist = SQR(ABS(star(j).x - star(i).x) ^ 2 + ABS(star(j).y - star(i).y) ^ 2)
  182.                                     IF dist < away1 THEN
  183.                                         IF away1 < away2 THEN
  184.                                             away2 = away1
  185.                                             jay2 = jay1
  186.                                         END IF
  187.                                         away1 = dist
  188.                                         jay1 = j
  189.                                     ELSE
  190.                                         IF dist < away2 THEN
  191.                                             away2 = dist
  192.                                             jay2 = j
  193.                                         END IF
  194.                                     END IF
  195.                                 END IF
  196.                             END IF
  197.                         END IF
  198.                     NEXT
  199.                     IF jay1 < 100 AND star(i).t > star(jay1).t * 3 THEN
  200.                         SendFleet i, jay1, star(jay1).t * 2 + 10
  201.                         star(jay1).d = 400
  202.                     ELSE
  203.                         IF jay2 < 100 AND star(i).t > star(jay2).t * 3 THEN
  204.                             SendFleet i, jay2, star(jay2).t * 2 + 10
  205.                             star(jay2).d = 400
  206.                         END IF
  207.                     END IF
  208.                 END IF
  209.             END IF
  210.  
  211.             IF p = 1 THEN
  212.                 sf2 = 100
  213.                 FOR i = 0 TO 99
  214.                     IF star(i).o = id AND i <> home(id) AND star(i).t > LL * 1.6 THEN
  215.                         sf3 = star(i).t / 2.5
  216.                         FOR j = 0 TO 99
  217.                             IF star(j).d > 0 THEN
  218.                                 star(j).d = star(j).d - 1
  219.                             ELSE
  220.                                 IF star(j).o <> id AND star(i).t > star(j).t * 4 THEN
  221.                                     FOR k = 0 TO 99
  222.                                         IF star(k).o = id THEN
  223.                                             dist = SQR(ABS(star(k).x - star(j).x) ^ 2 + ABS(star(k).y - star(j).y) ^ 2)
  224.                                             IF dist <= 250 * ratio THEN
  225.                                                 sf1 = i
  226.                                                 sf2 = j
  227.                                                 EXIT FOR
  228.                                             END IF
  229.                                         END IF
  230.                                     NEXT
  231.                                 END IF
  232.                             END IF
  233.                         NEXT
  234.                         IF sf2 < 100 THEN EXIT FOR
  235.                     END IF
  236.                 NEXT
  237.                 IF sf2 < 100 THEN
  238.                     SendFleet sf1, sf2, sf3
  239.                     star(sf2).d = 400
  240.                     EXIT FOR
  241.                 END IF
  242.             END IF
  243.  
  244.             IF p = 2 THEN
  245.                 FOR i = 0 TO 99
  246.                     IF i <> home(id) AND star(i).o = id THEN
  247.                         IF star(i).t > 49 THEN
  248.                             ok = 1
  249.                             FOR j = 0 TO 99
  250.                                 IF star(j).o <> id AND star(j).o <> 0 THEN
  251.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  252.                                     IF dist <= 400 * ratio THEN
  253.                                         ok = 0
  254.                                         EXIT FOR
  255.                                     END IF
  256.                                 END IF
  257.                             NEXT
  258.                             IF ok = 1 THEN
  259.                                 SendFleet i, home(id), star(i).t
  260.                                 EXIT FOR
  261.                             END IF
  262.                         END IF
  263.                     END IF
  264.                 NEXT
  265.                 IF ok = 1 THEN EXIT FOR
  266.             END IF
  267.  
  268.             IF p = 3 THEN
  269.                 ok = 0
  270.                 FOR i = 0 TO 99
  271.                     IF i <> home(id) AND star(i).o = id THEN
  272.                         IF star(i).t > LL * 2 THEN
  273.                             ok = 1
  274.                             EXIT FOR
  275.                         END IF
  276.                     END IF
  277.                 NEXT
  278.                 IF ok = 1 THEN
  279.                     SendFleet i, home(id), star(i).t / 4
  280.                     EXIT FOR
  281.                 END IF
  282.             END IF
  283.  
  284.         NEXT
  285.  
  286.     END IF
  287.  
  288. SUB GamePanel
  289.     x1 = sw / 4
  290.     y1 = sh / 4
  291.     speed = 0
  292.     _DEST gp
  293.     COLOR 0, 8
  294.     CLS
  295.     _FONT ttf72
  296.     n$ = "Beyond The Stars"
  297.     l = _PRINTWIDTH(n$)
  298.     _PRINTSTRING ((960 - l) / 2, 12), n$
  299.     LINE (40, 100)-(920, 100), 0
  300.     COLOR 7, 8
  301.     _FONT ttf36
  302.     _PRINTSTRING (42, 120), "Save"
  303.     _PRINTSTRING (42, 180), "Load"
  304.     COLOR 0, 7
  305.     LINE (910, 9)-(950, 49), 7, BF
  306.     _PRINTSTRING (921, 10), "x"
  307.     FOR i = 146 TO 886 STEP 82
  308.         LINE (i, 115)-(i + 39, 158), 7, BF
  309.         LINE (i, 175)-(i + 39, 218), 7, BF
  310.         _PRINTSTRING (i + 10, 120), CHR$((i - 144) / 81 + 48)
  311.         _PRINTSTRING (i + 10, 180), CHR$((i - 144) / 81 + 48)
  312.     NEXT
  313.     n$ = "Custom Mode"
  314.     c = 159
  315.     IF dm = 0 AND LL = 0 THEN
  316.         c = 7
  317.         IF cm = 1 THEN c = 168
  318.     END IF
  319.     l2 = 0
  320.     l1 = _PRINTWIDTH(n$)
  321.     LINE (40, 235)-(60 + l1, 295), c, BF
  322.     COLOR 0, c
  323.     _PRINTSTRING (50, 250), n$
  324.     n$ = "Demo Mode"
  325.     bmp = 2
  326.     c = 159
  327.     IF cm = 0 THEN
  328.         c = 7
  329.         IF dm = 1 THEN
  330.             c = 168
  331.             bmp = 1
  332.         END IF
  333.     END IF
  334.     l2 = l1
  335.     l1 = _PRINTWIDTH(n$)
  336.     LINE (76 + l2, 235)-(96 + l1 + l2, 295), c, BF
  337.     COLOR 0, c
  338.     _PRINTSTRING (86 + l2, 250), n$
  339.     n$ = "Rectangle"
  340.     c = 159
  341.     IF cm = 0 AND dm = 0 THEN
  342.         c = 7
  343.         IF rm = 1 THEN c = 168
  344.     END IF
  345.     l2 = l2 + l1
  346.     l1 = _PRINTWIDTH(n$)
  347.     LINE (112 + l2, 235)-(132 + l1 + l2, 295), c, BF
  348.     COLOR 0, c
  349.     _PRINTSTRING (122 + l2, 250), n$
  350.     n$ = "New Game"
  351.     c = 7
  352.     IF dm = 1 OR cm = 1 THEN c = 159
  353.     l2 = l2 + l1
  354.     l1 = _PRINTWIDTH(n$)
  355.     LINE (148 + l2, 235)-(168 + l1 + l2, 295), c, BF
  356.     COLOR 0, c
  357.     _PRINTSTRING (158 + l2, 250), n$
  358.     n$ = "Play a Duel"
  359.     c = 159
  360.     IF cm = 0 AND dm = 0 THEN
  361.         c = 7
  362.         IF duel = 1 THEN c = 168
  363.     END IF
  364.     l1 = _PRINTWIDTH(n$)
  365.     LINE (40, 310)-(60 + l1, 370), c, BF
  366.     COLOR 0, c
  367.     _PRINTSTRING (50, 325), n$
  368.     n$ = "Scrambled"
  369.     c = 159
  370.     IF cm = 0 AND dm = 0 THEN
  371.         c = 7
  372.         IF sm = 1 THEN c = 168
  373.     END IF
  374.     l2 = l1
  375.     l1 = _PRINTWIDTH(n$)
  376.     LINE (76 + l2, 310)-(96 + l1 + l2, 370), c, BF
  377.     COLOR 0, c
  378.     _PRINTSTRING (86 + l2, 325), n$
  379.     n$ = "Grouped"
  380.     c = 159
  381.     IF cm = 0 AND dm = 0 THEN
  382.         c = 7
  383.         IF gm = 1 THEN c = 168
  384.     END IF
  385.     l2 = l2 + l1
  386.     l1 = _PRINTWIDTH(n$)
  387.     LINE (112 + l2, 310)-(132 + l1 + l2, 370), c, BF
  388.     COLOR 0, c
  389.     _PRINTSTRING (122 + l2, 325), n$
  390.     _FONT ttf24
  391.     FOR i = 134 TO 874 STEP 134
  392.         j = j + 1
  393.         prod = 0
  394.         ship = 0
  395.         FOR k = 0 TO 99
  396.             IF star(k).o = j THEN
  397.                 prod = prod + star(k).p
  398.                 ship = ship + star(k).t
  399.             END IF
  400.         NEXT
  401.         LINE (i, 386)-(i + 120, 490), colors(j), BF
  402.         COLOR 0, colors(j)
  403.         _PRINTSTRING (i, 408), STR$(prod)
  404.         _PRINTSTRING (i, 448), STR$(ship)
  405.     NEXT
  406.     _FONT ttf36
  407.     COLOR 7, 8
  408.     _PRINTSTRING (40, 400), "Prod:"
  409.     _PRINTSTRING (40, 444), "Ship:"
  410.     n$ = "           Left Click Color Picker      Right Click To Close"
  411.     l = _PRINTWIDTH(n$)
  412.     _PRINTSTRING ((960 - l) / 2, 500), n$, gp
  413.     _PUTIMAGE (x1, y1), gp, 0, (0, 0)-(960 * ratio, 540 * ratio)
  414.     _DEST 0
  415.  
  416. SUB GetInput
  417.  
  418.     IF ch = CHR$(27) THEN
  419.         repeat = 0
  420.         SaveGame "savegame"
  421.     END IF
  422.     IF ch = "n" THEN NewGame
  423.     IF ch = "t" THEN tt = 1 - tt
  424.     IF ch = "p" THEN paused = 1 - paused
  425.     IF ch = "+" THEN
  426.         IF speed < 10 THEN speed = speed + 1
  427.     END IF
  428.     IF ch = "-" THEN
  429.         IF speed > 0 THEN speed = speed - 1
  430.     END IF
  431.     IF ch = "q" THEN QuickSave
  432.     IF ch = "l" THEN QuickRestore
  433.     IF ch = "g" THEN
  434.         gact = 1
  435.         paused = 1
  436.     END IF
  437.     ch = INKEY$
  438.  
  439.  
  440.     lclk = 0
  441.     rclk = 0
  442.  
  443.  
  444.         lmb = _MOUSEBUTTON(1)
  445.         rmb = _MOUSEBUTTON(2)
  446.  
  447.         x = _MOUSEX
  448.  
  449.         IF lmb AND lcx = sw THEN lcx = x
  450.         IF rmb AND rcx = sw THEN rcx = x
  451.  
  452.     WEND
  453.  
  454.     x = _MOUSEX
  455.     y = _MOUSEY
  456.  
  457.     IF lmb = 0 AND lcx < sw THEN lclk = 1
  458.     IF rmb = 0 AND rcx < sw THEN rclk = 1
  459.  
  460.     lcx = sw
  461.     rcx = sw
  462.  
  463.     IF rclk = 1 AND (cm = 0 OR gact = 1) THEN
  464.         IF pact = 1 OR oact = 1 OR gact = 1 THEN
  465.             rclk = 0
  466.             oact = 0
  467.             pact = 0
  468.             gact = 0
  469.         ELSE
  470.             i = Identify
  471.             IF i = 100 THEN
  472.                 IF src = 100 THEN
  473.                     paused = 1 - paused
  474.                     ch = ""
  475.                 ELSE
  476.                     src = 100
  477.                 END IF
  478.                 rclk = 0
  479.             END IF
  480.         END IF
  481.     END IF
  482.  
  483.     IF lclk = 1 AND paused = 1 AND pact = 0 AND oact = 0 AND gact = 0 THEN
  484.         i = Identify
  485.         IF i = 100 THEN
  486.             gact = 1
  487.             lclk = 0
  488.         END IF
  489.     END IF
  490.  
  491.  
  492. FUNCTION Identify
  493.     ii = 100
  494.     FOR i = 0 TO 99
  495.         dx = star(i).x - x
  496.         dy = star(i).y - y
  497.         IF ABS(dx) <= star(i).s + 10 + cm * 40 AND ABS(dy) <= star(i).s + 10 + cm * 40 THEN
  498.             ii = i
  499.             EXIT FOR
  500.         END IF
  501.     NEXT
  502.     Identify = ii
  503.  
  504. SUB OrderPanel (i)
  505.     x1 = star(i).x - 420 * ratio
  506.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  507.     x2 = x1 + 400 * ratio
  508.     y1 = star(i).y
  509.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  510.     y2 = y1 + 225 * ratio
  511.     _DEST op
  512.     CLS 0, 8
  513.     COLOR 0, 8
  514.     _FONT ttf72
  515.     n$ = RTRIM$(star(i).n)
  516.     l = _PRINTWIDTH(n$)
  517.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, op
  518.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  519.     _PRINTSTRING (20 * ratio, 80 * ratio), "0123456789", op
  520.     COLOR 7, 8
  521.     _FONT ttf36
  522.     IF box = 0 THEN
  523.         _PRINTSTRING (20 * ratio, 166 * ratio), "If Over", op
  524.         xo = 142 * ratio: xd = 250 * ratio: yo = 166 * ratio: yd = 200 * ratio
  525.         LINE (xo, yo)-(xd, yd), 7, BF
  526.         xo = 268 * ratio: xd = 314 * ratio: yo = 166 * ratio: yd = 200 * ratio
  527.         LINE (xo, yo)-(xd, yd), 7, BF
  528.         xo = 332 * ratio: xd = 366 * ratio: yo = 166 * ratio: yd = 200 * ratio
  529.         LINE (xo, yo)-(xd, yd), 7, BF
  530.         n$ = RTRIM$(strng0)
  531.         COLOR 0, 7
  532.         _FONT ttf24
  533.         _PRINTSTRING (148 * ratio, 172 * ratio), n$, op
  534.         _PRINTSTRING (273 * ratio, 172 * ratio), "OK", op
  535.         _PRINTSTRING (341 * ratio, 172 * ratio), "X", op
  536.     END IF
  537.     IF box = 1 THEN
  538.         _PRINTSTRING (20 * ratio, 166 * ratio), "Then Send", op
  539.         xo = 198 * ratio: xd = 278 * ratio: yo = 166 * ratio: yd = 200 * ratio
  540.         LINE (xo, yo)-(xd, yd), 7, BF
  541.         xo = 294 * ratio: xd = 340 * ratio: yo = 166 * ratio: yd = 200 * ratio
  542.         LINE (xo, yo)-(xd, yd), 7, BF
  543.         xo = 356 * ratio: xd = 390 * ratio: yo = 166 * ratio: yd = 200 * ratio
  544.         LINE (xo, yo)-(xd, yd), 7, BF
  545.         n$ = RTRIM$(strng1)
  546.         COLOR 0, 7
  547.         _FONT ttf24
  548.         _PRINTSTRING (200 * ratio, 172 * ratio), n$, op
  549.         _PRINTSTRING (299 * ratio, 172 * ratio), "OK", op
  550.         _PRINTSTRING (365 * ratio, 172 * ratio), "X", op
  551.     END IF
  552.     _PUTIMAGE (x1, y1), op, 0, (0, 0)-(400 * ratio, 225 * ratio)
  553.     _DEST 0
  554.     oanx = x1: oany = y1
  555.  
  556. SUB PaintBackground
  557.     x = RND * sw
  558.     y = RND * sh
  559.     c = RND * 14 + 1
  560.     PSET (x, y), c
  561.     RANDOMIZE USING seed
  562.     FOR i = 1 TO 600 * ratio
  563.         x = RND * sw
  564.         y = RND * sh
  565.         c = RND * 14 + 1
  566.         PSET (x, y), c
  567.     NEXT
  568.  
  569. SUB PaintFleet
  570.     count = fltcnt
  571.     i = 0
  572.     WHILE count
  573.         IF fleet(i).o <> 0 THEN
  574.             CIRCLE (fleet(i).x1, fleet(i).y1), 3, colors(fleet(i).o)
  575.             count = count - 1
  576.         END IF
  577.         i = i + 1
  578.     WEND
  579.  
  580. SUB PaintStars
  581.  
  582.     'execute standing orders
  583.     FOR i = 0 TO 99
  584.         IF order(i).src <> 100 THEN
  585.             IF star(i).o <> 1 OR star(order(i).dst).o <> 1 THEN
  586.                 order(i).src = 100
  587.             ELSE
  588.                 LINE (star(i).x, star(i).y)-(star(order(i).dst).x, star(order(i).dst).y), 18
  589.                 IF star(i).t >= order(i).ovr THEN
  590.                     SendFleet order(i).src, order(i).dst, order(i).shp
  591.                 END IF
  592.             END IF
  593.         END IF
  594.     NEXT
  595.  
  596.     FOR i = 0 TO 99
  597.         c = star(i).c
  598.         x = star(i).x
  599.         y = star(i).y
  600.         o = star(i).o
  601.         CIRCLE (x, y), (star(i).s + 8) * ratio, c
  602.         COLOR 15
  603.         IF o > 0 THEN
  604.             PAINT (x, y), colors(o), c
  605.         END IF
  606.         _FONT ttf16
  607.         IF tt THEN
  608.             n$ = star(i).n
  609.             n$ = RTRIM$(n$)
  610.             l = _PRINTWIDTH(n$)
  611.             _PRINTSTRING (x + 10, y), STR$(star(i).p), 0
  612.         ELSE
  613.             n$ = STR$(star(i).t)
  614.             l = _PRINTWIDTH(n$)
  615.         END IF
  616.         _PRINTSTRING (x - l / 2, y + 14), n$, 0
  617.     NEXT
  618.  
  619.  
  620. SUB Player
  621.  
  622.     ' Custom Map Mode
  623.     IF cm = 1 THEN
  624.         IF lmb THEN
  625.             i = Identify
  626.             IF i < 100 THEN
  627.                 WHILE _MOUSEINPUT: WEND
  628.                 nx = _MOUSEX
  629.                 ny = _MOUSEY
  630.                 ok = 1
  631.                 FOR j = 0 TO 99
  632.                     IF j <> i THEN
  633.                         dist = SQR(ABS(nx - star(j).x) ^ 2 + ABS(ny - star(j).y) ^ 2)
  634.                         IF dist <= 60 THEN
  635.                             ok = 0
  636.                             EXIT FOR
  637.                         END IF
  638.                     END IF
  639.                 NEXT
  640.                 IF ok = 1 THEN
  641.                     star(i).x = nx
  642.                     star(i).y = ny
  643.                 ELSE
  644.                     _MOUSEMOVE star(i).x, star(i).y
  645.                 END IF
  646.             END IF
  647.         END IF
  648.     END IF
  649.  
  650.     'Add new order to standing orders
  651.     IF ord.src <> 100 THEN
  652.         i = ord.src
  653.         IF ord.shp = 0 THEN
  654.             order(i).src = 100
  655.         ELSE
  656.             order(i) = ord
  657.         END IF
  658.         src = 100
  659.         ord.src = 100
  660.     END IF
  661.  
  662.     IF pact = 0 AND oact = 0 AND gact = 0 AND wact = 0 THEN
  663.  
  664.         'If there is no source star see if we can get one
  665.         IF src = 100 AND cm = 0 THEN
  666.             i = Identify
  667.             IF i < 100 THEN WorldPanel i
  668.             IF lclk = 1 OR rclk = 1 THEN
  669.                 lclk = 0
  670.                 rclk = 0
  671.                 src = i
  672.             END IF
  673.         END IF
  674.  
  675.         ' If there is a source star then draw a range line that snaps to center of destination, if one
  676.         IF src <> 100 THEN
  677.             c = 12
  678.             FOR i = 0 TO 99
  679.                 IF star(i).o = 1 THEN
  680.                     dist = SQR(ABS(star(i).x - x) ^ 2 + ABS(star(i).y - y) ^ 2)
  681.                     IF dist <= 251 * ratio THEN
  682.                         c = 10
  683.                         EXIT FOR
  684.                     END IF
  685.                 END IF
  686.             NEXT
  687.             i = Identify
  688.             IF i <> 100 THEN
  689.                 x = star(i).x
  690.                 y = star(i).y
  691.             END IF
  692.             rang = SQR(ABS(star(src).x - x) ^ 2 + ABS(star(src).y - y) ^ 2)
  693.             LINE (star(src).x, star(src).y)-(x, y), c
  694.             n$ = STR$(INT(rang))
  695.             _FONT ttf16
  696.             _PRINTSTRING (x + 20, y), n$, 0
  697.         END IF
  698.  
  699.         'If we have a source star see if we clicked on a destination star
  700.         IF src <> 100 THEN
  701.             IF lclk = 1 OR rclk = 1 THEN
  702.                 i = Identify
  703.                 IF i = src THEN
  704.                     lclk = 0
  705.                     src = 100
  706.                     IF rclk = 1 THEN
  707.                         rclk = 0
  708.                         order(i).src = 100
  709.                     END IF
  710.                 ELSE
  711.                     IF i < 100 AND i <> src THEN
  712.                         IF lclk = 1 THEN
  713.                             lclk = 0
  714.                             FOR j = 0 TO 99
  715.                                 IF star(j).o = 1 THEN
  716.                                     dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  717.                                     IF dist <= 250 THEN
  718.                                         dst = i
  719.                                         pact = 1
  720.                                         EXIT FOR
  721.                                     END IF
  722.                                 END IF
  723.                             NEXT
  724.                         ELSE
  725.                             rclk = 0
  726.                             dst = i
  727.                             IF star(i).o = 1 THEN
  728.                                 oact = 1
  729.                             END IF
  730.                         END IF
  731.                     END IF
  732.                 END IF
  733.             END IF
  734.         END IF
  735.     END IF
  736.  
  737.     'If the game panel is active
  738.     IF gact = 1 THEN
  739.         GamePanel
  740.         IF lclk = 1 THEN
  741.             x1 = sw / 4 + 910: x2 = x1 + 40: y1 = sh / 4 + 9: y2 = y1 + 39
  742.             IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  743.                 ch = CHR$(27)
  744.             END IF
  745.             FOR i = 143 TO 874 STEP 81
  746.                 x1 = sw / 4 + i: x2 = x1 + 39: y1 = sh / 4 + 115: y2 = y1 + 60
  747.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  748.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  749.                     SaveGame n$
  750.                 END IF
  751.                 y1 = y1 + 60: y2 = y2 + 60
  752.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  753.                     n$ = "savegame" + CHR$((i - 143) / 81 + 48)
  754.                     LoadGame n$
  755.                 END IF
  756.             NEXT
  757.             _FONT ttf36
  758.             l2 = 0
  759.             l1 = _PRINTWIDTH("Custom Mode")
  760.             IF LL = 0 AND dm = 0 THEN
  761.                 x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  762.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  763.                     cm = 1 - cm
  764.                     IF cm = 1 THEN gact = 0
  765.                 END IF
  766.             END IF
  767.             l2 = l1
  768.             l1 = _PRINTWIDTH("Demo Mode")
  769.             IF cm = 0 THEN
  770.                 x1 = 76 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  771.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  772.                     dm = 1 - dm
  773.                     IF dm = 0 THEN
  774.                         ncp = 5
  775.                         bmp = 2
  776.                     ELSE
  777.                         ncp = 6
  778.                         bmp = 1
  779.                         gact = 0
  780.                     END IF
  781.                 END IF
  782.             END IF
  783.             l2 = l2 + l1
  784.             l1 = _PRINTWIDTH("Rectangle")
  785.             IF cm = 0 AND dm = 0 THEN
  786.                 x1 = 112 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  787.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  788.                     rm = 1 - rm
  789.                 END IF
  790.                 l2 = l2 + l1
  791.                 l1 = _PRINTWIDTH("New Game")
  792.                 x1 = 148 + sw / 4 + l2: x2 = x1 + 20 + l1: y1 = 235 + sh / 4: y2 = y1 + 60
  793.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  794.                     gact = 0
  795.                     NewGame
  796.                 END IF
  797.                 l1 = _PRINTWIDTH("Play a Duel")
  798.                 x1 = 40 + sw / 4: x2 = x1 + 20 + l1: y1 = 310 + sh / 4: y2 = y1 + 60
  799.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  800.                     duel = 1 - duel
  801.                 END IF
  802.                 l2 = _PRINTWIDTH("Scrambled")
  803.                 x1 = 76 + sw / 4 + l1: x2 = x1 + l2 + 20: y1 = 310 + sh / 4: y2 = y1 + 60
  804.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  805.                     sm = 1 - sm
  806.                     gm = 0
  807.                 END IF
  808.                 l1 = l1 + l2
  809.                 l2 = _PRINTWIDTH("Grouped")
  810.                 x1 = 112 + sw / 4 + l1: x2 = x1 + l2 + 20: y1 = 310 + sh / 4: y2 = y1 + 60
  811.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  812.                     gm = 1 - gm
  813.                     sm = 0
  814.                 END IF
  815.             END IF
  816.             FOR i = 134 TO 874 STEP 134
  817.                 j = j + 1
  818.                 x1 = sw / 4 + i: x2 = x1 + 124: y1 = sh / 4 + 386: y2 = y1 + 104
  819.                 IF x > x1 AND x < x2 AND y > y1 AND y < y2 THEN
  820.                     tmp = colors(1)
  821.                     colors(1) = colors(j)
  822.                     colors(j) = tmp
  823.                 END IF
  824.             NEXT
  825.         END IF
  826.     END IF
  827.  
  828.     'If the star standing orders panel is active
  829.     IF oact = 1 THEN
  830.  
  831.         IF star(src).o = 1 THEN
  832.             OrderPanel dst
  833.         END IF
  834.  
  835.         IF rclk = 1 THEN oact = 0
  836.  
  837.         IF box = 0 THEN
  838.             tmp$ = RTRIM$(strng0)
  839.         ELSE
  840.             tmp$ = RTRIM$(strng1)
  841.         END IF
  842.  
  843.         IF lclk = 1 THEN
  844.  
  845.             x1 = oanx: x2 = oanx + 400 * ratio
  846.             y1 = oany: y2 = oany + 540 * ratio
  847.  
  848.             IF y > y1 + 80 * ratio AND y < y1 + 152 * ratio THEN
  849.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  850.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  851.                     IF box = 0 THEN
  852.                         n$ = RTRIM$(strng0)
  853.                         l = LEN(n$)
  854.                         IF l < 8 THEN strng0 = tmp$ + STR$(dig)
  855.                     ELSE
  856.                         n$ = RTRIM$(strng1)
  857.                         l = LEN(n$)
  858.                         IF l < 8 THEN strng1 = tmp$ + STR$(dig)
  859.                     END IF
  860.                 END IF
  861.             END IF
  862.  
  863.             IF y > y1 + 166 * ratio AND y < y1 + 200 * ratio THEN
  864.  
  865.                 IF box = 0 THEN
  866.  
  867.                     IF x > x1 + 268 * ratio AND x < x1 + 314 * ratio THEN
  868.                         ord.ovr = INT(VAL(strng0))
  869.                         box = 1
  870.                     END IF
  871.  
  872.                     IF x > x1 + 332 * ratio AND x < x1 + 366 * ratio THEN
  873.                         strng0 = ""
  874.                     END IF
  875.  
  876.                 ELSE
  877.  
  878.                     IF x > x1 + 294 * ratio AND x < x1 + 340 * ratio THEN
  879.                         IF INT(VAL(strng1)) > ord.ovr THEN
  880.                             strng1 = ""
  881.                         ELSE
  882.                             box = 0
  883.                             oact = 0
  884.                             ord.src = src
  885.                             ord.dst = dst
  886.                             ord.shp = VAL(strng1)
  887.                             strng0 = ""
  888.                             strng1 = ""
  889.                         END IF
  890.                     END IF
  891.  
  892.                     IF x > x1 + 356 * ratio AND x < x1 + 390 * ratio THEN
  893.                         strng0 = ""
  894.                         strng1 = ""
  895.                         box = 0
  896.                     END IF
  897.  
  898.                 END IF
  899.  
  900.             END IF
  901.         END IF
  902.         x1 = 10000: y1 = 10000
  903.  
  904.     END IF
  905.  
  906.  
  907.     'If the fleet send panel is active
  908.     IF pact = 1 THEN
  909.         IF rclk = 1 THEN pact = 0
  910.         IF star(src).o = 1 THEN
  911.             ShowPanel dst
  912.         END IF
  913.         IF lclk = 1 THEN
  914.             tmp$ = RTRIM$(strng)
  915.  
  916.             x1 = panx: x2 = panx + 400 * ratio
  917.             y1 = pany: y2 = pany + 540 * ratio
  918.  
  919.             IF y > y1 + 256 * ratio AND y < y1 + 328 * ratio THEN
  920.                 IF x > x1 + 20 * ratio AND x < x1 + 380 * ratio THEN
  921.                     dig = (x - x1 - 32 * ratio) / (37 * ratio)
  922.                     strng = tmp$ + STR$(dig)
  923.                 END IF
  924.             END IF
  925.  
  926.             IF y > y1 + 334 * ratio AND y < y1 + 374 * ratio THEN
  927.                 IF x > x1 + 20 * ratio AND x < x1 + 84 * ratio THEN
  928.                     pact = 0
  929.                     value = star(src).t
  930.                     SendFleet src, dst, value
  931.                     src = 100
  932.                 END IF
  933.                 IF x > x1 + 102 * ratio AND x < x1 + 184 * ratio THEN
  934.                     pact = 0
  935.                     value = star(src).t / 2
  936.                     SendFleet src, dst, value
  937.                     src = 100
  938.                 END IF
  939.                 IF x > x1 + 202 * ratio AND x < x1 + 282 * ratio THEN
  940.                     pact = 0
  941.                     value = star(src).t / 3
  942.                     SendFleet src, dst, value
  943.                     src = 100
  944.                 END IF
  945.                 IF x > x1 + 300 * ratio AND x < x1 + 380 * ratio THEN
  946.                     strng = ""
  947.                 END IF
  948.             END IF
  949.  
  950.             IF y > y1 + 460 * ratio AND y < y1 + 530 * ratio THEN
  951.                 IF x > x1 + 32 * ratio AND x < x1 + 182 * ratio THEN
  952.                     value = VAL(strng)
  953.                     strng = ""
  954.                     pact = 0
  955.                     IF value <= star(src).t AND star(src).t <> o THEN
  956.                         SendFleet src, dst, value
  957.                     END IF
  958.                     src = 100
  959.                 END IF
  960.                 IF x > x1 + 212 * ratio AND x < x1 + 362 * ratio THEN
  961.                     pact = 0
  962.                     src = 100
  963.                     strng = ""
  964.                 END IF
  965.             END IF
  966.         END IF
  967.     END IF
  968.  
  969. SUB QuickSave
  970.     FOR i = 0 TO 99: qstar(i) = star(i): qorder(i) = order(i): NEXT
  971.     FOR i = 0 TO 1999: qfleet(i) = fleet(i): NEXT
  972.     FOR i = 0 TO 6: qhome(i) = home(i): NEXT
  973.     qfltcnt = fltcnt
  974.     qLL = LL
  975.  
  976. SUB QuickRestore
  977.     FOR i = 0 TO 99: star(i) = qstar(i): order(i) = qorder(i): NEXT
  978.     FOR i = 0 TO 1999: fleet(i) = qfleet(i): NEXT
  979.     FOR i = 0 TO 6: home(i) = qhome(i): NEXT
  980.     fltcnt = qfltcnt
  981.     LL = qLL
  982.     paused = 1
  983.  
  984. SUB LoadGame (n$)
  985.     n$ = n$ + ".sav"
  986.     IF _FILEEXISTS(n$) THEN
  987.         OPEN n$ FOR BINARY AS #2
  988.         GET #2, , star()
  989.         GET #2, , order()
  990.         GET #2, , fleet()
  991.         GET #2, , home()
  992.         GET #2, , colors()
  993.         GET #2, , fltcnt
  994.         GET #2, , LL
  995.         CLOSE #2
  996.         PRINT "Game Loaded"
  997.         dm = 0
  998.         cm = 0
  999.         rm = 0
  1000.         duel = 0
  1001.         ncp = 5
  1002.         bmp = 2
  1003.         it = 0
  1004.     END IF
  1005.  
  1006. SUB SaveGame (n$)
  1007.     n$ = n$ + ".sav"
  1008.     OPEN n$ FOR BINARY AS #1
  1009.     CLOSE #1
  1010.     KILL n$
  1011.     OPEN n$ FOR BINARY AS #1
  1012.     PUT #1, , star()
  1013.     PUT #1, , order()
  1014.     PUT #1, , fleet()
  1015.     PUT #1, , home()
  1016.     PUT #1, , colors()
  1017.     PUT #1, , fltcnt
  1018.     PUT #1, , LL
  1019.     CLOSE #1
  1020.     PRINT "Game Saved"
  1021.  
  1022. SUB SendFleet (src, dst, ships)
  1023.     IF fltcnt < 2000 THEN
  1024.         FOR i = 0 TO 1999
  1025.             IF fleet(i).o = 0 THEN
  1026.                 fleet(i).o = star(src).o
  1027.                 fleet(i).d = dst
  1028.                 fleet(i).x1 = star(src).x
  1029.                 fleet(i).y1 = star(src).y
  1030.                 fleet(i).x2 = star(dst).x
  1031.                 fleet(i).y2 = star(dst).y
  1032.                 fleet(i).t = ships
  1033.                 star(src).t = star(src).t - ships
  1034.                 fltcnt = fltcnt + 1
  1035.                 EXIT FOR
  1036.             END IF
  1037.         NEXT
  1038.         IF LL < 20000 AND fleet(i).o <> 1 THEN LL = LL + 1
  1039.     END IF
  1040.  
  1041. SUB ShowPanel (i)
  1042.     x1 = star(i).x - 420 * ratio
  1043.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1044.     x2 = x1 + 400 * ratio
  1045.     y1 = star(i).y
  1046.     IF y1 > sh - 560 * ratio THEN y1 = sh - 560 * ratio
  1047.     y2 = y1 + 540 * ratio
  1048.     _DEST sp
  1049.     CLS 0, 8
  1050.     COLOR 0, 8
  1051.     _FONT ttf72
  1052.     n$ = RTRIM$(star(src).n)
  1053.     l = _PRINTWIDTH(n$)
  1054.     _PRINTSTRING ((400 * ratio - l) / 2, 12 * ratio), n$, sp
  1055.     n$ = "to"
  1056.     l = _PRINTWIDTH(n$)
  1057.     _PRINTSTRING ((400 * ratio - l) / 2, 80 * ratio), n$, sp
  1058.     n$ = RTRIM$(star(dst).n)
  1059.     l = _PRINTWIDTH(n$)
  1060.     _PRINTSTRING ((400 * ratio - l) / 2, 152 * ratio), n$, sp
  1061.     LINE (20 * ratio, 239 * ratio)-(380 * ratio, 239 * ratio), 0
  1062.     _PRINTSTRING (20 * ratio, 256 * ratio), "0123456789", sp
  1063.     n$ = RTRIM$(strng)
  1064.     l = _PRINTWIDTH(n$)
  1065.     _PRINTSTRING ((400 * ratio - l) / 2, 383 * ratio), n$, sp
  1066.     xo = 20 * ratio: xd = 84 * ratio: yo = 334 * ratio: yd = 374 * ratio
  1067.     LINE (xo, yo)-(xd, yd), 7, BF
  1068.     xo = 102 * ratio: xd = 184 * ratio: yo = 334 * ratio: yd = 374 * ratio
  1069.     LINE (xo, yo)-(xd, yd), 7, BF
  1070.     xo = 202 * ratio: xd = 282 * ratio: yo = 334 * ratio: yd = 374 * ratio
  1071.     LINE (xo, yo)-(xd, yd), 7, BF
  1072.     xo = 300 * ratio: xd = 380 * ratio: yo = 334 * ratio: yd = 374 * ratio
  1073.     LINE (xo, yo)-(xd, yd), 7, BF
  1074.     xo = 32 * ratio: xd = 182 * ratio: yo = 458 * ratio: yd = 530 * ratio
  1075.     LINE (xo, yo)-(xd, yd), 7, BF
  1076.     xo = 212 * ratio: xd = 362 * ratio: yo = 458 * ratio: yd = 530 * ratio
  1077.     LINE (xo, yo)-(xd, yd), 7, BF
  1078.     _FONT ttf24
  1079.     COLOR 7, 8
  1080.     n$ = RTRIM$(STR$(star(src).t))
  1081.     l = _PRINTWIDTH(n$)
  1082.     _PRINTSTRING (120 * ratio - l, 112 * ratio), n$, sp
  1083.     n$ = RTRIM$(STR$(star(dst).t))
  1084.     l = _PRINTWIDTH(n$)
  1085.     _PRINTSTRING (300 * ratio - l, 112 * ratio), n$, sp
  1086.     _FONT ttf16
  1087.     COLOR 0, 7
  1088.     _PRINTSTRING (38 * ratio, 347 * ratio), "ALL", sp
  1089.     _PRINTSTRING (122 * ratio, 347 * ratio), "HALF", sp
  1090.     _PRINTSTRING (214 * ratio, 347 * ratio), "THIRD", sp
  1091.     _PRINTSTRING (312 * ratio, 347 * ratio), "CLEAR", sp
  1092.     _FONT ttf72
  1093.     _PRINTSTRING (60 * ratio, 458 * ratio), "Ok", sp
  1094.     _PRINTSTRING (216 * ratio, 458 * ratio), "Quit", sp
  1095.     _PUTIMAGE (x1, y1), sp, 0, (0, 0)-(400 * ratio, 540 * ratio)
  1096.     panx = x1: pany = y1
  1097.     _DEST 0
  1098.  
  1099. SUB Update
  1100.     IF paused = 0 THEN
  1101.         RANDOMIZE TIMER
  1102.         FOR i = 0 TO 99
  1103.             r = INT(RND * 60)
  1104.             IF r < star(i).p THEN
  1105.                 IF star(i).o > 0 THEN
  1106.                     star(i).t = star(i).t + 1
  1107.                 ELSE
  1108.                     IF INT(RND * 10) < 3 THEN
  1109.                         star(i).t = star(i).t + 1
  1110.                     END IF
  1111.                 END IF
  1112.             END IF
  1113.         NEXT
  1114.  
  1115.         count = fltcnt
  1116.         i = 0
  1117.         WHILE count
  1118.             IF fleet(i).o <> 0 THEN
  1119.                 count = count - 1
  1120.                 IF fleet(i).x2 > fleet(i).x1 THEN
  1121.                     fleet(i).x1 = fleet(i).x1 + 1
  1122.                 ELSEIF fleet(i).x2 < fleet(i).x1 THEN
  1123.                     fleet(i).x1 = fleet(i).x1 - 1
  1124.                 END IF
  1125.                 IF fleet(i).y2 > fleet(i).y1 THEN
  1126.                     fleet(i).y1 = fleet(i).y1 + 1
  1127.                 ELSEIF fleet(i).y2 < fleet(i).y1 THEN
  1128.                     fleet(i).y1 = fleet(i).y1 - 1
  1129.                 END IF
  1130.                 IF fleet(i).x1 = fleet(i).x2 AND fleet(i).y1 = fleet(i).y2 THEN
  1131.                     dest = fleet(i).d
  1132.                     IF star(dest).o = fleet(i).o THEN
  1133.                         star(dest).t = star(dest).t + fleet(i).t
  1134.                         fleet(i).o = 0
  1135.                         fltcnt = fltcnt - 1
  1136.                     ELSE
  1137.                         o = star(dest).o
  1138.                         IF o > 0 AND star(dest).t < fleet(i).t * 0.6 THEN
  1139.                             k = 100
  1140.                             shortest = 10000
  1141.                             FOR j = 0 TO 99
  1142.                                 IF star(j).o = o THEN
  1143.                                     dist = SQR(ABS(star(j).x - star(dest).x) ^ 2 + ABS(star(j).y - star(dest).y) ^ 2)
  1144.                                     IF dist < shortest THEN
  1145.                                         shortest = dist
  1146.                                         k = j
  1147.                                     END IF
  1148.                                 END IF
  1149.                             NEXT
  1150.                             SendFleet dest, k, star(dest).t * 0.90
  1151.                             star(dest).t = 0
  1152.                             star(dest).o = fleet(i).o
  1153.                             star(dest).t = fleet(i).t
  1154.                             star(dest).o = fleet(i).o
  1155.                             fleet(i).o = 0
  1156.                             fltcnt = fltcnt - 1
  1157.                         ELSE
  1158.                             IF fleet(i).t * 1.1 > star(dest).t THEN
  1159.                                 alive = 1
  1160.                                 WHILE alive
  1161.                                     alive = 0
  1162.                                     damorg = fleet(i).t / 10 + 1
  1163.                                     damdst = star(dest).t / 8 + 1
  1164.                                     fleet(i).t = fleet(i).t - damdst
  1165.                                     star(dest).t = star(dest).t - damorg
  1166.                                     IF fleet(i).t > 0 AND star(dest).t > 0 THEN
  1167.                                         alive = 1
  1168.                                     END IF
  1169.                                 WEND
  1170.                                 IF star(dest).t < 1 THEN
  1171.                                     star(dest).t = fleet(i).t
  1172.                                     star(dest).o = fleet(i).o
  1173.                                 END IF
  1174.                                 fleet(i).o = 0
  1175.                                 fltcnt = fltcnt - 1
  1176.                             ELSE
  1177.                                 k = 100
  1178.                                 shortest = 10000
  1179.                                 FOR j = 0 TO 99
  1180.                                     IF star(j).o = fleet(i).o THEN
  1181.                                         dist = SQR(ABS(star(j).x - fleet(i).x1) ^ 2 + ABS(star(j).y - fleet(i).y1) ^ 2)
  1182.                                         IF dist < shortest THEN
  1183.                                             shortest = dist
  1184.                                             k = j
  1185.                                         END IF
  1186.                                     END IF
  1187.                                 NEXT
  1188.                                 IF k < 100 THEN
  1189.                                     fleet(i).x2 = star(k).x
  1190.                                     fleet(i).y2 = star(k).y
  1191.                                     fleet(i).d = k
  1192.                                 ELSE
  1193.                                     fleet(i).o = 0
  1194.                                     fltcnt = fltcnt - 1
  1195.                                 END IF
  1196.                             END IF
  1197.                         END IF
  1198.                     END IF
  1199.                 END IF
  1200.             END IF
  1201.             i = i + 1
  1202.         WEND
  1203.     END IF
  1204.  
  1205. SUB WorldPanel (i)
  1206.     x1 = star(i).x - 420 * ratio
  1207.     IF star(i).x < sw / 2 THEN x1 = star(i).x + 20 * ratio
  1208.     x2 = x1 + 400 * ratio
  1209.     y1 = star(i).y
  1210.     IF y1 > sh - 225 * ratio THEN y1 = sh - 225 * ratio
  1211.     y2 = y1 + 225 * ratio
  1212.     _DEST wp
  1213.     CLS 0, 8
  1214.     COLOR 0, 8
  1215.     _FONT ttf72
  1216.     n$ = RTRIM$(star(i).n)
  1217.     l = _PRINTWIDTH(n$)
  1218.     _PRINTSTRING ((400 * ratio - l) / 2, 4 * ratio), n$, wp
  1219.     LINE (20 * ratio, 76 * ratio)-(380 * ratio, 76 * ratio), 0
  1220.     COLOR 7, 8
  1221.     _FONT ttf36
  1222.     _PRINTSTRING (20 * ratio, 90 * ratio), "Ships:", wp
  1223.     _PRINTSTRING (20 * ratio, 130 * ratio), "Production:", wp
  1224.     _PRINTSTRING (20 * ratio, 170 * ratio), "In Range:", wp
  1225.     _PRINTSTRING (240 * ratio, 90 * ratio), STR$(star(i).t), wp
  1226.     _PRINTSTRING (240 * ratio, 130 * ratio), STR$(star(i).p), wp
  1227.     n$ = "NO"
  1228.     FOR j = 0 TO 99
  1229.         IF star(i).o <> star(j).o THEN
  1230.             IF (star(i).o = 1 AND star(j).o > 1) OR star(j).o = 1 THEN
  1231.                 dist = SQR(ABS(star(i).x - star(j).x) ^ 2 + ABS(star(i).y - star(j).y) ^ 2)
  1232.                 IF dist <= 250 THEN
  1233.                     n$ = "YES"
  1234.                     EXIT FOR
  1235.                 END IF
  1236.             END IF
  1237.         END IF
  1238.     NEXT
  1239.     _PRINTSTRING (240 * ratio, 170 * ratio), n$, wp
  1240.     _PUTIMAGE (x1, y1), wp, 0, (0, 0)-(400 * ratio, 225 * ratio)
  1241.     _DEST 0
  1242.  
  1243. SUB NewGame
  1244.     DIM k AS INTEGER
  1245.     DIM r AS INTEGER
  1246.     DIM dx AS INTEGER
  1247.     DIM dy AS INTEGER
  1248.     DIM n AS STRING * 10
  1249.     DIM low AS LONG
  1250.     DIM high AS LONG
  1251.     DIM tot AS LONG
  1252.     paused = 1
  1253.     FOR i = 0 TO 999
  1254.         fleet(i).o = 0
  1255.     NEXT
  1256.     slct = 0
  1257.     fltcnt = 0
  1258.     LL = 0
  1259.     gact = 0
  1260.     ncp = 5
  1261.     bmp = 2
  1262.     IF duel = 1 THEN
  1263.         ncp = 1
  1264.         bmp = 2
  1265.     END IF
  1266.     seed = RND * 1000
  1267.     FOR i = 0 TO 99
  1268.         k = 1
  1269.         WHILE k
  1270.             k = 0
  1271.             ok = 0
  1272.             DO
  1273.                 x = RND * (sw - sww) + swn
  1274.                 y = RND * (sh - shw) + shn
  1275.                 ok = -1
  1276.                 IF rm = 1 AND x > sw / 4 AND x < sw - sw / 4 AND y > sh / 4 AND y < sh - sh / 4 THEN ok = 0
  1277.             LOOP UNTIL ok
  1278.             r = INT(RND * 200)
  1279.             n = names(r)
  1280.             FOR j = 0 TO i - 1
  1281.                 dx = x - star(j).x
  1282.                 dy = y - star(j).y
  1283.                 IF ABS(dx) < sww AND ABS(dy) < shw THEN
  1284.                     k = 1
  1285.                 END IF
  1286.                 IF n = star(j).n THEN
  1287.                     k = 1
  1288.                 END IF
  1289.             NEXT
  1290.         WEND
  1291.         star(i).n = n
  1292.         star(i).x = x
  1293.         star(i).y = y
  1294.         star(i).c = RND * 6 + 9
  1295.         star(i).s = RND * 5
  1296.         star(i).o = 0
  1297.         star(i).p = star(i).s + (RND * 5) + 3
  1298.         star(i).t = 0
  1299.         order(i).src = 100
  1300.     NEXT
  1301.     low = 10000000
  1302.     high = 0
  1303.     IF duel = 1 THEN
  1304.         duel = 0
  1305.         FOR j = 0 TO 99
  1306.             x = star(j).x
  1307.             y = star(j).y
  1308.             tot = x * y
  1309.             IF tot < low THEN
  1310.                 low = tot
  1311.                 a = j
  1312.             END IF
  1313.             IF tot > high THEN
  1314.                 high = tot
  1315.                 b = j
  1316.             END IF
  1317.         NEXT
  1318.         home(1) = a
  1319.         star(a).o = 1
  1320.         star(a).p = 10
  1321.         star(a).t = 100
  1322.         star(a).s = 4
  1323.         star(a).n = "Sol"
  1324.         star(a).c = 14
  1325.  
  1326.         home(2) = b
  1327.         star(b).o = 2
  1328.         star(b).p = 10
  1329.         star(b).t = 100
  1330.         star(b).s = 4
  1331.     ELSE
  1332.         FOR i = 1 TO 6
  1333.             ok = 0
  1334.             WHILE (ok < 1)
  1335.                 ok = 1
  1336.                 j = RND * 100
  1337.                 FOR k = 1 TO i - 1
  1338.                     dist = SQR(ABS(star(j).x - star(home(k)).x) ^ 2 + ABS(star(j).y - star(home(k)).y) ^ 2)
  1339.                     IF dist < 500 * ratio THEN
  1340.                         ok = 0
  1341.                         EXIT FOR
  1342.                     END IF
  1343.                 NEXT
  1344.                 IF ok = 1 THEN
  1345.                     ok = -1
  1346.                     FOR k = 0 TO 99
  1347.                         dist = SQR(ABS(star(j).x - star(k).x) ^ 2 + ABS(star(j).y - star(k).y) ^ 2)
  1348.                         IF dist <= 200 THEN ok = ok + 1
  1349.                         IF ok = 2 THEN EXIT FOR
  1350.                     NEXT
  1351.                 END IF
  1352.             WEND
  1353.             home(i) = j
  1354.             star(j).o = i
  1355.             star(j).p = 10
  1356.             star(j).t = 100
  1357.             star(j).s = 4
  1358.             colors(i) = i + 8
  1359.         NEXT
  1360.     END IF
  1361.     star(home(1)).n = "Sol"
  1362.     star(home(1)).c = 14
  1363.     speed = 0
  1364.     rm = 0
  1365.     IF sm = 1 THEN
  1366.         sm = 0
  1367.         FOR i = 0 TO 99
  1368.             IF star(i).o = 0 THEN
  1369.                 star(i).o = i MOD (ncp + 1) + 1
  1370.                 star(i).t = RND * 50 + 25
  1371.             END IF
  1372.         NEXT
  1373.     END IF
  1374.     IF gm = 1 THEN
  1375.         gm = 0
  1376.         FOR i = 0 TO 99 - ncp
  1377.             o = i MOD (ncp + 1) + 1
  1378.             jay = 100
  1379.             away = 10000
  1380.             FOR j = 0 TO 99
  1381.                 IF star(j).o = 0 THEN
  1382.                     dist = SQR(ABS(star(j).x - star(home(o)).x) ^ 2 + ABS(star(j).y - star(home(o)).y) ^ 2)
  1383.                     IF dist < away THEN
  1384.                         away = dist
  1385.                         jay = j
  1386.                     END IF
  1387.                 END IF
  1388.             NEXT
  1389.             star(jay).o = o
  1390.             star(jay).t = RND * 50 + 25
  1391.         NEXT
  1392.     END IF
  1393.     QuickSave
  1394.  
  1395. ' A lot of star names I made up
  1396.  
  1397. SUB StarNames
  1398.     names(0) = "Acamar"
  1399.     names(1) = "Arcab"
  1400.     names(2) = "Acrux"
  1401.     names(3) = "Adhara"
  1402.     names(4) = "Arneb"
  1403.     names(5) = "Antares"
  1404.     names(6) = "Arcturus"
  1405.     names(7) = "Atria"
  1406.     names(8) = "Beid"
  1407.     names(9) = "Betelgeuse"
  1408.     names(10) = "Botein"
  1409.     names(11) = "Beemim"
  1410.     names(12) = "Bellatrix"
  1411.     names(13) = "Bharani"
  1412.     names(14) = "Biham"
  1413.     names(15) = "Brachium"
  1414.     names(16) = "Canopus"
  1415.     names(17) = "Capella"
  1416.     names(18) = "Castor"
  1417.     names(19) = "Chara"
  1418.     names(20) = "Cursa"
  1419.     names(21) = "Copernicus"
  1420.     names(22) = "Chalawan"
  1421.     names(23) = "Chertan"
  1422.     names(24) = "Dabih"
  1423.     names(25) = "Dalim"
  1424.     names(26) = "Deneb"
  1425.     names(27) = "Denebola"
  1426.     names(28) = "Diadem"
  1427.     names(29) = "Diphda"
  1428.     names(30) = "Dschubba"
  1429.     names(31) = "Dziban"
  1430.     names(32) = "Edasich"
  1431.     names(33) = "Electra"
  1432.     names(34) = "Elgafar"
  1433.     names(35) = "Elkurud"
  1434.     names(36) = "Elnath"
  1435.     names(37) = "Eltanin"
  1436.     names(38) = "Enif"
  1437.     names(39) = "Errai"
  1438.     names(40) = "Fafnir"
  1439.     names(41) = "Fang"
  1440.     names(42) = "Fawaris"
  1441.     names(43) = "Felis"
  1442.     names(44) = "Fomalhaut"
  1443.     names(45) = "Fulu"
  1444.     names(46) = "Fumal"
  1445.     names(47) = "Furud"
  1446.     names(48) = "Garnet"
  1447.     names(49) = "Giausar"
  1448.     names(50) = "Gienah"
  1449.     names(51) = "Ginan"
  1450.     names(52) = "Gomeisa"
  1451.     names(53) = "Graffias"
  1452.     names(54) = "Grumium"
  1453.     names(55) = "Gudja"
  1454.     names(56) = "Hadar"
  1455.     names(57) = "Haedus"
  1456.     names(58) = "Hamal"
  1457.     names(59) = "Hassaleh"
  1458.     names(60) = "Hatysa"
  1459.     names(61) = "Helvetios"
  1460.     names(62) = "Heze"
  1461.     names(63) = "Homan"
  1462.     names(64) = "Iklil"
  1463.     names(65) = "Imai"
  1464.     names(66) = "Intercrus"
  1465.     names(67) = "Izar"
  1466.     names(68) = "Iccar"
  1467.     names(69) = "Inar"
  1468.     names(70) = "Iaeth"
  1469.     names(71) = "Imaous"
  1470.     names(72) = "Jabbah"
  1471.     names(73) = "Jishui"
  1472.     names(74) = "Jax"
  1473.     names(75) = "Jalae"
  1474.     names(76) = "Jewel"
  1475.     names(77) = "Jumbo"
  1476.     names(78) = "Jerue"
  1477.     names(79) = "Jabear"
  1478.     names(80) = "Kakkab"
  1479.     names(81) = "Kang"
  1480.     names(82) = "Kekouan"
  1481.     names(83) = "Keid"
  1482.     names(84) = "Kitalpha"
  1483.     names(85) = "Kochab"
  1484.     names(86) = "Kolob"
  1485.     names(87) = "Kobol"
  1486.     names(88) = "Larawag"
  1487.     names(89) = "Lesath"
  1488.     names(90) = "Libertas"
  1489.     names(91) = "Lich"
  1490.     names(92) = "Lilly"
  1491.     names(93) = "Laddel"
  1492.     names(94) = "Luminous"
  1493.     names(95) = "Lasacious"
  1494.     names(96) = "Mizar"
  1495.     names(97) = "Markab"
  1496.     names(98) = "Matar"
  1497.     names(99) = "Mintaka"
  1498.     names(100) = "Meleph"
  1499.     names(101) = "Menkar"
  1500.     names(102) = "Merga"
  1501.     names(103) = "Merope"
  1502.     names(104) = "Nahn"
  1503.     names(105) = "Naos"
  1504.     names(106) = "Nashira"
  1505.     names(107) = "Navi"
  1506.     names(108) = "Nekkar"
  1507.     names(109) = "Nembus"
  1508.     names(110) = "Nihal"
  1509.     names(111) = "Nunki"
  1510.     names(112) = "Ogma"
  1511.     names(113) = "Okab"
  1512.     names(114) = "Ohmy"
  1513.     names(115) = "Oragami"
  1514.     names(116) = "Origen"
  1515.     names(117) = "Omanii"
  1516.     names(118) = "Obytewa"
  1517.     names(119) = "Oglok"
  1518.     names(120) = "Phact"
  1519.     names(121) = "Pherkad"
  1520.     names(122) = "Pleione"
  1521.     names(122) = "Polaris"
  1522.     names(123) = "Pollux"
  1523.     names(124) = "Procyon"
  1524.     names(125) = "Proxima"
  1525.     names(126) = "Polis"
  1526.     names(127) = "Quaint"
  1527.     names(128) = "QB64"
  1528.     names(129) = "Quetzal"
  1529.     names(130) = "Qussol"
  1530.     names(131) = "Quella"
  1531.     names(132) = "Quyaeo"
  1532.     names(133) = "Ququdas"
  1533.     names(134) = "Quekak"
  1534.     names(135) = "Rasalas"
  1535.     names(136) = "Regor"
  1536.     names(137) = "Regulus"
  1537.     names(138) = "Rigel"
  1538.     names(139) = "Revati"
  1539.     names(140) = "Rotenev"
  1540.     names(141) = "Rukbat"
  1541.     names(142) = "Rastaban"
  1542.     names(143) = "Sabik"
  1543.     names(144) = "Sadr"
  1544.     names(145) = "Saiph"
  1545.     names(146) = "Sargas"
  1546.     names(147) = "Sarin"
  1547.     names(148) = "Syrma"
  1548.     names(149) = "Spica"
  1549.     names(150) = "Sirius"
  1550.     names(151) = "Tarazed"
  1551.     names(152) = "Taygeta"
  1552.     names(153) = "Tejat"
  1553.     names(154) = "Thabit"
  1554.     names(155) = "Thuban"
  1555.     names(156) = "Tiaki"
  1556.     names(157) = "Toliman"
  1557.     names(158) = "Torcular"
  1558.     names(157) = "Umala"
  1559.     names(158) = "Ulatte"
  1560.     names(159) = "Ubbessa"
  1561.     names(160) = "Unoless"
  1562.     names(161) = "Umaddem"
  1563.     names(162) = "Ummbra"
  1564.     names(162) = "Uniqu"
  1565.     names(163) = "Uzzaal"
  1566.     names(164) = "Vega"
  1567.     names(165) = "Veritate"
  1568.     names(166) = "Vindetrix"
  1569.     names(167) = "Vedas"
  1570.     names(168) = "Vergg"
  1571.     names(169) = "Vacant"
  1572.     names(170) = "Vucae"
  1573.     names(171) = "Vicar"
  1574.     names(172) = "Wasat"
  1575.     names(173) = "Wazn"
  1576.     names(174) = "Wezen"
  1577.     names(175) = "Waiten"
  1578.     names(176) = "Wachar"
  1579.     names(177) = "Wheelz"
  1580.     names(178) = "Whatsp"
  1581.     names(179) = "Wassand"
  1582.     names(180) = "Xenno"
  1583.     names(181) = "Xyphod"
  1584.     names(182) = "Xu"
  1585.     names(183) = "Xaal"
  1586.     names(184) = "Xyross"
  1587.     names(185) = "Xiggot"
  1588.     names(186) = "Xirrks"
  1589.     names(187) = "Yed"
  1590.     names(188) = "Yildun"
  1591.     names(189) = "Yundun"
  1592.     names(190) = "Yavyo"
  1593.     names(191) = "Yotrac"
  1594.     names(192) = "Yxzoqu"
  1595.     names(193) = "Ynnot"
  1596.     names(194) = "Zaniah"
  1597.     names(195) = "Zaurak"
  1598.     names(196) = "Zhang"
  1599.     names(197) = "Zibal"
  1600.     names(198) = "Zosma"
  1601.     names(199) = "Zuben"
  1602.  
« Last Edit: January 27, 2020, 02:11:06 am by romichess »
My name is Michael, but you can call me Mike :)