rem Cosmic Flight (CF.BAS)
rem Created by Joshua Beck
rem Version 2.0
rem Released under the GNU General Public Licence v3
rem mail: mikeosdeveloper@gmail.com
goto start
    
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

start:
  rem ***Cool Intro Text***
  gosub intro  

  cls

  rem ***draw the borders***
  gosub drawscreen

  rem ***print the character***
  ink 8
  move 40 24
  print chr 202 ;
  ink 7

  e = 0
  f = 0

  rem ***get the start time***
  t = timer

  rem ***set the character position to the same as we printed***
  p = 40

  rem ***start off with a grey ship***
  c = 8
  cursor off

play:
  do
    rem ***main gameplay loop***
    do
      rem ***we scroll the screen every 0.5 seconds or 10th tick***
      n = timer
      n = n - 6 

      rem ***while waiting we process movement***
      rem ***this makes the character responsive***
      getkey k

      rem ***if the escape key is presses then end***
      if k = 27 then goto endgame

      rem ***if a capital letter is pressed, make it lowercase***
      if k > 64 and k < 91 then k = k + 32

      rem ***if a movement key was pressed move the character***
      if k = 'a' then gosub goleft
      if k = 'd' then gosub goright

      if k = ' ' then gosub fireweapon

      rem ***loop until we need to scroll***
    loop until n = t

    rem ***get the next starting time***
    t = timer

    rem ***scroll the game area down a line***
    gosub scrollscreen

    rem ***display the new score and modifiers***
    gosub printscore

    rem ***place a new item on the blank line created***
    y = 0
    gosub placebonus

    rem ***add more depending on the score***
    rem ***note that these will be mostly bad***
    if s > 1999 then gosub placebonus
    if s > 4999 then gosub placebonus
    if s > 9999 then gosub placebonus

    rem ***change colour of character for score***
    gosub colourchange

    rem ***reprint character***
    ink c
    move p 24
    print chr 202 ;
    ink 7

    rem ***reduce benefits (if any)***
    if e > 0 then e = e - 1
    if f > 0 then f = f - 1

    rem ***loop until exited or lost***
  loop endless
  cursor on
end

goleft:
  rem ***make sure character is on the screen***
  if p < 31 then return

  rem ***erase current position*** 
  move p 24
  print " " ;

  rem ***move to new position***
  p = p - 1
  move p 24
  curschar b
  gosub checkbonus

  rem ***print character in correct colour***
  ink c
  print chr 202 ;
  ink 7
return

goright:
  rem ***make sure that character is on the screen***
  if p > 49 then return

  rem ***erase current position***
  move p 24
  print " " ;

  rem ***move to new position***
  p = p + 1
  move p 24

  rem ***check for items there, apply effects***
  curschar b
  gosub checkbonus

  rem ***print character in correct colour***
  ink c
  print chr 202 ;
  ink 7
return

colourchange:
  rem ***set the colour depending on how many point have been scored***
  if s < 100 then c = 8
  if s > 99 then c = 7
  if s > 199 then c = 15
  if s > 499 then c = 14
  if s > 999 then c = 12
  if s > 1999 then c = 9
  if s > 4999 then c = 11
  if s > 9999 then c = 13
return

fireweapon:
  q = 0
  if s > 99 then q = q + 1
  if s > 199 then q = q + 1
  if s > 499 then q = q + 1
  if s > 999 then q = q + 1
  if s > 1999 then q = q + 1
  if s > 4999 then q = q + 1
  if s > 9999 then q = q + 1
  if q = 0 then return
  if e > 0 then q = q + 1
  if e > 0 then e = e - 1
  ink c
  if q = 1 then for r = 0 to 3
  if q = 2 then for r = 0 to 7
  if q = 3 then for r = 0 to 11
  if q > 3 then for r = 0 to 23
    y = 23 - r
    move p y
    print "|" ;
    if q > 4 then gosub extrawp
    y = y % 4
    if y = 3 then pause 1
  next r
  pause 1
  t = timer
  ink 7
  if q = 1 then for r = 0 to 3
  if q = 2 then for r = 0 to 7
  if q = 3 then for r = 0 to 11
  if q > 3 then for r = 0 to 23
    y = 23 - r
    move p y
    print " " ;
    if q > 4 then gosub extrawp
  next r
  move p 24
  gosub colourchange
  ink c
  print chr 202 ;
  ink 7
  if s > 99 then s = s - 100
  if s > 1999 then s = s - 200
  if s > 4999 then s = s - 500
  if s > 9999 then s = s - 1000
  gosub scrollscreen
return

extrawp:
  move p y
  curschar b
  v = p - 1
  move v y
  if v > 29 then print chr b ;
  v = p + 1
  move v y
  if v < 51 then print chr b ;
  if q = 5 then return
  v = p - 2
  move v y
  if v > 29 then print chr b ;
  v = p + 2
  move v y
  if v < 51 then print chr b ;
  if q = 6 then return
  v = p - 3
  move v y
  if v > 29 then print chr b ;
  v = p + 3
  move v y
  if v < 51 then print chr b ; 
  v = p - 4
  move v y
  if v > 29 then print chr b ;
  v = p + 4
  move v y
  if v > 51 then print chr b ;
return

checkbonus:
  rem ***make sure an item exists***
  if b = 0 then return
  if b = 32 then return

  rem ***check the effect of the item***
  i = 0
  j = 0

  rem ***positive items***
  if b = 224 then j = 10
  if b = 225 then j = 20
  if b = 227 then j = 50
  if b = 228 then j = 100
  if b = 172 then j = 250
  if b = 171 then j = 500
  if b = 252 then j = 1000
  if b = 253 then j = 2000

  rem ***negative items***
  if b = 35 then i = 50
  if b = 168 then i = 100
  if b = 254 then i = 200
  if b = 64 then i = 500
  if b = 33 then i = 1000
  if b = 19 then i = 2000

  rem ***change amount for current modifiers***
  if m = 1 then j = j + 10
  if m = 2 then j = j + 20
  if m = 3 then j = j + 50
  if m = 4 then j = j * 2
  if m = 4 then i = i * 3
  if m = 5 then j = j * 2
  if m = 5 then i = i * 3

  rem ***if a modifer is active reduce is by one use***
  if m > 0 then l = l - 1

  rem ***if it gets to zero remove the modifier***
  if l = 0 then m = 0

  rem ***if there is a negative item remove the modifer***
  if i > 0 then m = 0

  rem ***check for new powerups and create modifiers***
  if b = 43 then m = 2
  if b = 43 then l = 10
  if b = 36 then m = 3
  if b = 36 then l = 10
  if b = 42 then m = 5
  if b = 42 then l = 20

  rem ***weapons bonuses***
  if b = 94 then e = e + 5

  rem ***shield bonuses***
  if b = 62 then f = f + 50

  rem ***add positive total to the score***
  if i = 0 then s = s + j

  rem ***check score is more than negative total***
  rem ***if not the player looses***
  if i > s then goto gameover

  rem ***remove negative total from score***
  if i > 0 then s = s - i
return

gameoverani:
  219 178 177 176 32

gameover:
  rem ***display death animation***
  ink 4
  v = p - 1
  p = p + 1
  for t = 1 to 5
    read gameoverani t j
    for w = v to p
      for x = 23 to 24
        move w x
        print chr j ;
      next x
    next w
    pause 1
  next t

  rem ***print game over message***
  ink 7
  move 0 4
  print "Game Over"

  rem ***calculator how far negative the score is***
  i = i - s

  rem ***display it in red***
  move 0 0
  ink 4
  print "Energy : -" ;
  number i $1
  print $1
  waitkey k

  rem ***return everything to normal and exit***
  ink 7
  cls
  cursor on
end

endgame:
  move 0 4
  print "Game Over"
  waitkey k
  ink 7
  cls
  cursor on
end 

scrollscreen:
  rem ***scroll down one line***
  for r = 0 to 23

    rem ***uses lines in opposite direction (23-0)
    y = 23 - r

    for w = 30 to 50
      rem ***collect character***
      move w y
      curschar b
      curscol v
      
      rem ***if it's the player character then don't go over it***
      rem ***also collect the previous character as bonus***
      if w = p and y = 23 then gosub checkbonus
      if w = p and y = 23 then goto noscroll

      rem ***move down one line and print character***
      y = y + 1
      move w y
      ink v
      print chr b ;
      y = y - 1
      noscroll:
    next w

    rem ***blank line after moving***
    move 30 y
    print "                     " ;
  next r
  ink 7
return

drawscreen:
  for y = 0 to 24
    rem ***print borders***
    move 29 y
    print chr 221 ;
    move 51 y
    print chr 222 ;

    rem ***randomly place items***
    rand x 1 5
    if y < 10 and x = 1 then gosub placebonus
  next y

  rem ***print the basic information***
  move 0 0
  print "Energy : 0"
  print "Highest: 0"
  print "Modifier: None"
  print "No Weapon"
return

placebonus:
  rem ***move to a random position on y line***
  rand w 30 50
  move w y

  rem ***vary the amount of good and bad items depending on the score***
  if s = 0 then goto goodbonus
  d = s / 10
  rem ***max out at 80% bad (800 points)***
  if d > 80 then d = 80

  rem ***increase for futher scores***
  if s > 5000 then d = 90
  if s > 10000 then d = 95

  rand w 1 100
  if w < d then goto badbonus

goodbonus:
  rem ***pick a item***
  rem ***the rarer ones are more valueable***
  rem ***if the player has more point, get rarer items***
  rand w 1 88
  if s > 999 then rand w 26 92
  if s > 1999 then rand w 51 100
  if s > 4999 then rand w 76 100
  if s > 4999 and w > 95 then rand w 76 100
  if s > 9999 then rand w 91 100
  if s > 9999 and w > 95 then rand w 91 100
  if s > 9999 and w > 95 then rand w 91 100

  rem ***good bonuses (increasing value)***
  if w < 51 then v = 224
  if w > 50 and w < 76 then v = 225
  if w > 75 and w < 86 then v = 227
  if w > 85 and w < 91 then v = 228
  if w > 90 and w < 93 then v = 172
  if w = 93 then v = 171
  if w = 94 then v = 252
  if w = 95 then v = 253

  rem ***the last five are powerups***
  if w = 96 then v = 43
  if w = 97 then v = 62
  if w = 98 then v = 36
  if w = 99 then v = 94
  if w = 100 then v = 42

  rem ***print good items/powerups in green***
  ink 2
  print chr v ;
  ink 7
return

badbonus:
  rem ***pick an item***
  rem ***the rarer ones are more dangerous***
  rem ***if a player has more point, make more dangerous items***
  rand w 1 50
  if s > 999 then rand w 46 75
  if s > 1999 then rand w 51 100
  if s > 4999 then rand w 76 100
  if s > 9999 then rand w 91 100

  rem ***bad items (increasing energy loss)***
  if w < 51 then v = 35
  if w > 50 and w < 76 then v = 168
  if w > 75 and w < 86 then v = 254
  if w > 85 and w < 96 then v = 15
  if w > 95 and w < 100 then v = 33
  if w = 100 then v = 19

  rem ***print bad items in red***
  ink 4
  print chr v ;
  ink 7
return

printscore:
  rem ***print current score***
  if s > g then ink 2
  if s = g then ink 7
  if s < g then ink 4
  g = s
  move 9 0
  print "     " ;
  move 9 0
  print s
  ink 7
  if s > h then ink 2
  if s > h then h = s
  move 9 1
  print "     " ;
  move 9 1
  print h
  ink 7

  rem ***print current modifier + uses remaining***
  move 10 2
  print "                  " ;
  move 10 2
  if m = 0 then print "None" ;
  if m = 2 then print "+20" ;
  if m = 3 then print "+50" ;
  if m = 5 then print "Double" ;
  if m > 0 then print " (" ;
  if m > 0 then print l ;
  if m > 0 then print " uses)"

  rem ***find out weapon***
  q = 0
  if s > 99 then q = q + 1
  if s > 199 then q = q + 1
  if s > 499 then q = q + 1
  if s > 999 then q = q + 1
  if s > 1999 then q = q + 1
  if s > 4999 then q = q + 1
  if s > 9999 then q = q + 1
  if e > 0 then q = q + 1
  
  rem ***now print it***
  gosub colourchange
  ink c
  move 0 3
  if q = 0 then print "No Weapon      "
  if q = 1 then print "Mini Laser     "
  if q = 2 then print "Standard Laser "
  if q = 3 then print "Power Laser    "
  if q = 4 then print "Fire Laser     "
  if q = 5 then print "Mega Beam      "
  if q = 6 then print "Giga Beam      "
  if q > 6 then ink 71
  if q > 6 then print "Death Ray      "
  if q > 6 then ink 7
  ink 7
return

intro:
  x = 25
  y = 1
  cursor off
  ink 0
  move x y
  print "#### #### ### ##### ##### ####"
  y = y + 1
  move x y
  print "#    #  # #   # # #   #   #   "
  y = y + 1
  move x y
  print "#    #  # ### # # #   #   #   "
  y = y + 1
  move x y
  print "#    #  #   # # # #   #   #   "
  y = y + 1
  move x y
  print "#### #### ### # # # ##### ####"
  y = y + 2
  move x y
  print "#### #    ##### #### #  # #####"
  y = y + 1
  move x y
  print "#    #      #   #    #  #   #  "
  y = y + 1
  move x y
  print "#### #      #   # ## ####   #  "
  y = y + 1
  move x y
  print "#    #      #   #  # #  #   #  "
  y = y + 1
  move x y
  print "#    #### ##### #### #  #   #  "

  y = y - 10
  v = x + 30
  w = y + 10

  for t = x to v
    for u = y to w
      move t u
      curschar z
      if z = '#' then print chr 219 ;
    next u
  next t

  ink 15
  v = x - 5
  w = x + 35
  for u = 0 to 24
    for t = 0 to v
      move t u
      rand s 1 10
      if s = 10 then print chr 42 ;
    next t
    for t = w to 79
      move t u
      rand s 1 10
      if s = 10 then print chr 42 ;
    next t
  next u

  ink 12
  for s = 1 to 13
    if s = 7 then s = 8
    if s = 8 then y = y + 6
    w = y + 5
    read letterstart s v
    v = v + x
    s = s + 1
    read letterstart s r
    s = s - 1
    r = r - 1 + x
    for t = v to r
      for u = y to w
        move t u
        curschar z
        print chr z ;
      next u
    next t
    if s < 7 then pause 2
    sound 5000 1
  next s

  y = y - 6
  w = x - 3
  u = x + 33
  ink 8
  for v = 0 to 24
    move w v
    print chr 219 ; 
    move u v
    print chr 219 ;
    t = timer
    do 
      z = timer
    loop until z > t
  next v

  ink 28
  w = w + 1
  u = u - 1
  for v = 0 to 24
    for t = w to u
      move t v
      curschar s
      print chr s ;
    next t
  next v

  pause 1

  ink 31
  w = y + 12
  v = x - 1
  move v w
  print "Cosmic Flight is a fast paced"
  gosub newline
  print "adventure game, in which you must"
  gosub newline
  print "guide your small ship through a"
  gosub newline
  print "dangerous galaxy, collecting as"
  gosub newline
  print "much energy as possible."
  gosub newline
  gosub newline
  print "Use 'A' and 'D' to move and space"
  gosub newline
  print "to fire your laser weapon."
  gosub newline
  print "Collect " ;
  ink 18
  print "green" ;
  ink 31 
  print " items and avoid " ;
  ink 20
  print "red" ; 
  ink 31
  gosub newline
  print " ones. As you get more powerful,"
  gosub newline
  print "the game will become much harder."

  v = x - 21
  w = y + 12
  ink 2
  move v w
  print "Good Items:"
  gosub newline
  print chr 224 ;
  print " =   10 Energy"
  gosub newline
  print chr 225 ;
  print " =   20 Energy"
  gosub newline
  print chr 227 ;
  print " =   50 Energy"
  gosub newline
  print chr 228 ;
  print " =  100 Energy"
  gosub newline
  print chr 172 ;
  print " =  250 Energy"
  gosub newline
  print chr 171 ;
  print " =  500 Energy"
  gosub newline
  print chr 252 ;
  print " = 1000 Energy"
  gosub newline
  print chr 253 ;
  print " = 2000 Energy"

  v = x + 36
  w = y + 12
  move v w
  ink 4
  print "Bad Items:"
  gosub newline
  print chr 35 ;
  print " =   -50 Energy"
  gosub newline
  print chr 168 ;
  print " =  -100 Energy"
  gosub newline
  print chr 254 ;
  print " =  -200 Energy"
  gosub newline
  print chr 15 ;
  print " =  -500 Energy"
  gosub newline
  print chr 33 ;
  print " = -1000 Energy"
  gosub newline
  print chr 19 ;
  print " = -2000 Energy"  

  v = x - 1
  w = y + 23
  move v w
  ink 31
  print "Press any key to start... " ;
  v = v + 25
  move v w
  cursor on
  waitkey k

  cls
  ink 7
  r = 0
  s = 0
  t = 0 
  u = 0
  v = 0
  w = 0
  x = 0
  y = 0
  z = 0
return

letterstart:
  0 5 10 14 20 26 31
  0 5 10 16 21 26 32

newline:
  w = w + 1
  move v w
  pause 2
return
