############################################################################
#
#	File:     ranstars.icn
#
#	Subject:  Program to display star field
#
#	Author:   Ralph E. Griswold
#
#	Date:     March 2, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#     This program display a random field of "stars" on an ANSI terminal.
#  It displays stars at randomly chosen positions on the screen until
#  the specified maximum number is reached. It then extinguishes existing
#  stars and creates new ones for the specified steady-state time, after
#  which the stars are extinguished, one by one.
#
#     The programming technique is worth noting. It is originally due to
#  Steve Wampler.
#
#     The options are:
#
#	-m n	maximum number of stars, default 10.
#
#	-t n	length of steady-state time before stars are extinguished,
#		  default 50.
#
#	-s c	the character to be used for "stars", default *. If
#		  more than one character is given, only the first is
#		  used.
#
############################################################################
#
#  Requires:  co-expressions, ANSI terminal
#
############################################################################
#
#  Links:  ansi, options, random
#
############################################################################

link ansi
link options
link random

procedure main(args)
   local length, steady, star, opts, r, ran1, ran2

   randomize()

   opts := options(args,"m+t+s:")
   length := \opts["m"] | 10
   steady := \opts["t"] | 50
   star := \opts["s"] | "*"
   star := star[1]
   r := 0

   ran1 := create 2(&random :=: r, |?(24 | 80), &random <-> r)
   ran2 := ^ran1
   clear()				# clear the screen
   every 1 to length do			# start up the universe
      place(ran1,star)
   every 1 to steady do {		# steady state condition
      place(ran2," ")			# clean up the beginning
      place(ran1,star)			# create more
      }
   every 1 to length do			# and the universe dies
      place(ran2," ")			# clean up the end
   clear()				# clear the screen
   home()				# home the cursor
end

procedure clear()
   ED()
   return
end

procedure home()
   CUP(1,1)
   return
end

procedure place(e,s)
   CUP(@e,@e)
   writes(s)
   return
end
