!#################################
! RAIN.BAS   A Typing game
!
! by Dave Heyliger - AMUS Staff
!
! Directions: Select a speed and
!  type as the letters "rain"
!  before you drown!!!
!
! you will need INKEY.M68[100,52]
!#################################

MAP1    DROP,F                  !The "letter"
MAP1    COUNT,F                 !The number of letters raining
MAP1    DROPS(26),F             !An array of "letters"
MAP1    COL,F                   !Where the letter will drop from
MAP1    RAINX(26),F             !The X coordinates of the raindrops
MAP1    RAINY(26),F             !The Y coordinates of the raindrops
MAP1    KEY,S,1                 !The last key you pressed
MAP1    J,F                     !Various integers
MAP1    X,F
MAP1    I,F
MAP1    WATER'LINE,S,80,""      !The dreaded "water"
MAP1    WATER,F                 !The location of the "water"
MAP1    SPEED,F                 !Your selected speed
MAP1    TOTAL,F                 !The total number of characters "survived"

!-- The intro screen
!
? TAB(-1,0)
? TAB(5,20) "   ENTER THE DELAY VALUE:"
? TAB(6,20) "     EXPERT:        250"
? TAB(7,20) "     ADVANCED:      500"
? TAB(8,20) "     INTERMEDIATE: 1000"
? TAB(9,20) "     NOVICE:       1500"
? TAB(10,20)"     ALL-THUMBS:   2000"
? TAB(12,20);:INPUT "   YOUR SPEED PLEASE.. ",SPEED

!--- initialize
!
WATER = 24
PRINT TAB(-1,0);
PRINT TAB(-1,29);
FOR X = 1 TO 79 : WATER'LINE = WATER'LINE + "-" : NEXT X
? TAB(WATER,1) WATER'LINE;
COUNT = 1
TOTAL = 0
RANDOMIZE

TOP:
!--- Create a new "raindrop" and let em fall
!
FOR D = 1 TO SPEED : NEXT D
KEY=""
DROP = INT(65+RND(1)*25)
COL = INT(78*RND(1)+1)
PRINT TAB(1,COL) CHR$(DROP);
RAINY(COUNT)=1
RAINX(COUNT)=COL
DROPS(COUNT) = DROP
COUNT = COUNT + 1
TOTAL = TOTAL + 1

BUMP:
!--- "bump" down the raindrops every pass
!
FOR I= 1 TO 26
       IF RAINY(I) > 0 &
          THEN PRINT TAB(RAINY(I),RAINX(I)) " ";: &
               RAINY(I) = RAINY(I) + 1 :&
               PRINT TAB(RAINY(I),RAINX(I)) CHR$(DROPS(I));
NEXT I


GET'KEY:
!--- Get the next key the user enters..
!
XCALL INKEY,KEY
KEY = UCS(KEY)
IF KEY="" THEN GOTO SPLASH
X = 1
CH:
IF X > 26 THEN GOTO SPLASH
       IF DROPS(X) <> ASC(KEY) &
               THEN X = X + 1 : GOTO CH &
               ELSE ? TAB(RAINY(X),RAINX(X)) " ";:&
                    FOR J = X TO 25 :
                        RAINY(J) = RAINY(J+1) :&
                        RAINX(J) = RAINX(J+1) :&
                        DROPS(J) = DROPS(J+1) :&
                    NEXT J :&
                    COUNT = COUNT - 1 :&
                    RAINY(26) = 0 : RAINX(26) = 0 : DROPS(26) = 0 :&
                    GOTO CH

SPLASH:
!--- Check for the "splash"
!
IF RAINY(1) <> (WATER - 1) THEN GOTO TOP
? TAB(RAINY(1),RAINX(1)) " ";
FOR J = 1 TO 25 :
RAINY(J) = RAINY(J+1) :&
RAINX(J) = RAINX(J+1) :&
DROPS(J) = DROPS(J+1) :&
NEXT J
COUNT = COUNT - 1
RAINY(26) = 0 : RAINX(26) = 0 : DROPS(26) = 0
WATER = WATER - 1
TOTAL = TOTAL - 1
? TAB(WATER,1) WATER'LINE;
IF WATER <> 2 THEN GOTO SPLASH
? TAB (10,35) "   GLUB     "
? TAB (12,28) "   Total = " TOTAL "    "
FOR X = 1 TO 9000 : NEXT X
PRINT TAB(-1,28)
PRINT TAB(-1,0)
END