'===========================================================================
' Subject: CANYON                             Date: 10-11-97 (18:38)       
'  Author: Chris Gunn                         Code: QB, QBasic, PDS        
'  Origin: Aaron Tucker                     Packet: DEMOS.ABC
'===========================================================================
'See if the changes below don't help make it easier to work.  Set up this way
'you can tell which player crashed and into what.  I used the <Tab> key but you
'could use "F"aster and "S"lower.
'The two subroutines at the bottom are the timing secrets for all of my games.
'Your FOR loop would create different speeds on different computers.

'/\_/\ CANYON.BAS /\_/\ Hail to the Commodore PET!
DECLARE SUB Timing (Dly#)

SCREEN 0, 0, 0
RANDOMIZE TIMER

intensity = 3
' 2 speed demon   3 default    4 lazy
' 5 slow poke     6 grandma    7 snail
CLS
DIM Course(25) AS STRING * 80
COLOR 12, 0
FOR X% = 1 TO 25
   Course(X%) = "º" + SPACE$(78) + "º"
   LOCATE 24, 1: PRINT Course(X%)
NEXT X%

Speed# = .25  '  500 whoosh!  1000 wheee!    1500 cool!
               ' 2000 ok       2500 <yawn>    3000 Commodore PET
               ' 3500 <- baud  4000 zzzzz...
               ' 3000+ would be fun with obstacles..

' P1Alive = 0 : P2Alive = 0    'not yet implemented
p1x = 33: p1y = 8       'Player 1's X and Y position
p2x = 38: p2y = 8       'Player 2's X and Y position

LWall = 20   'Left Wall X position
RWall = 50   'Right Wall X position

  DO
  Move$ = INKEY$
   IF LEN(Move$) THEN
      IF Move$ = CHR$(9) THEN Speed# = Speed# - .01 '<Tab> Speed up
      IF Move$ = CHR$(0) + CHR$(15) THEN Speed# = Speed# + .01 '<Shift-Tab>

       ' Player 1 Shift AZ (up and down)  <> (left and right)
       IF Move$ = "," AND p1x > 1 THEN p1x = p1x - 1
       IF Move$ = "." AND p1x < 79 THEN p1x = p1x + 1

       ' Player 2 Shift 85 (up and down)  46 (left and right)
       IF Move$ = "4" AND p2x > 1 THEN p2x = p2x - 1
       IF Move$ = "6" AND p2x < 79 THEN p2x = p2x + 1
   ELSE
      ' Leave player in same column
   END IF
    ' Print screen
  LOCATE p1y, p1x: COLOR 14, 1: PRINT "1"
  LOCATE p2y, p2x: COLOR 8, 1: PRINT "2"
  wallmove = INT(RND * intensity) + 1
  IF wallmove = 1 AND LWall > 1 THEN LWall = LWall - 1: RWall = RWall - 1
  IF wallmove = 2 AND RWall < 75 THEN LWall = LWall + 1: RWall = RWall + 1
  ' !! !!  walls go in and out...neat huh?
  CrushEm = INT(RND * 100) + 1
  IF CrushEm < 15 AND LWall <> 1 THEN LWall = LWall - 1: RWall = RWall + 1
  IF CrushEm < 15 THEN SOUND 1525, .5
  IF CrushEm > 74 AND RWall <> 75 THEN LWall = LWall + 1: RWall = RWall - 1
  IF CrushEm > 74 THEN SOUND 541, .5

   IF Move$ = "\" THEN STOP
   ' IF LWall + 2 = RWall THEN GOTO GameOver
   IF MID$(Course(p1y), p1x, 1) > "9" THEN GOTO GameOver
   IF MID$(Course(p2y), p2x, 1) > "9" THEN GOTO GameOver
   IF MID$(Course(p1y), p1x, 1) = "2" THEN GOTO GameOver
   IF MID$(Course(p2y), p2x, 1) = "1" THEN GOTO GameOver
   Course(25) = "º" + SPACE$(78) + "º"
   FOR X% = 1 TO 24
      SWAP Course(X%), Course(X% + 1) ' Move everything up
   NEXT X%
   MID$(Course(23), LWall) = "²±°"
   MID$(Course(23), RWall) = "°±²"
   IF MID$(Course(p1y), p1x, 1) = " " THEN MID$(Course(p1y + 1), p1x) = "1"
   IF MID$(Course(p2y), p2x, 1) = " " THEN MID$(Course(p2y + 1), p2x) = "2"
   'IF LWall > 1 THEN LOCATE 24, LWall: COLOR 12, 0: PRINT "["
   'IF RWall < 75 THEN LOCATE 23, RWall: COLOR 12, 0: PRINT "["
   COLOR 12, 0
   LOCATE 24, 1: PRINT Course(23)
   Score% = Score% + 1
  ' Control the loop timing
  ' FOR DelayPause = 1 TO speed: NEXT DelayPause
   CALL Timing(Speed#)
LOOP UNTIL Move$ = CHR$(27)

GameOver:
  LOCATE 24, 1: COLOR 15, 4: PRINT "--SPLAT--   Score: "; Score%
END

SUB Holding (Dly#)
'Precision time delay in seconds,tenths,and hundredths
Begin# = TIMER
WHILE ABS(TIMER - Begin#) < Dly#: WEND
END SUB

SUB Timing (Dly#) STATIC
'Precision execution loop delay
WHILE ABS(TIMER - Begin#) < Dly#: WEND
Begin# = TIMER
END SUB
