!*********************************************************
! HOTROD.BAS
!
! by Dave Heyliger - AMUS Staff
!
! A Race Car Game
!
! NEEDS INKEY.SBR (INKEY.M68 in [100,52])
!*********************************************************

MAP1    track,S,25,"*                       *"
MAP1    track'course,F
MAP1    track'center,F
MAP1    track'centers(24),F
MAP1    car'spot,F
MAP1    top'car1,S,7," O-M-O "
MAP1    mid'car,S,7,"  [ ]  "
MAP1    end'car1,S,7," O-W-O "
MAP1    in'key,S,1
MAP1    racer'data(24),F
MAP1    racer'loc,F
MAP1    miles,F


!instructions:
       ? TAB(-1,0)
       ? TAB(5,10)"Car stays in middle of screen. Use LEFT and RIGHT arrows"
       ? TAB(6,10)"to move car in appropriate direction.   Do not hit other"
       ? TAB(7,10)"cars or the side walls. ";
       INPUT " Hit RETURN to begin... ",A$

!initialize game by producing beginning of track

       RANDOMIZE                                       !random track gen.
       ? TAB(-1,0)                                     !clear screen
       ? TAB(-1,29)                                    !print track at bottom
       track'center=40                                 !start at center
       miles=0                                         !traveled 0 miles

       FOR j = 12 to 24                                !do this 13 times:
          CALL out'track                               !print 1 line of track
          PRINT
          track'centers(j)=track'center                !save track center(s)
       NEXT j                                          !start of track done

       car'spot = 40                                   !set car to middle

loop:   FOR k = 1 to 15                                 !do this 15 times:
       ON ERROR GOTO END                               !quit on ^C
       CALL move'car                                   !move/print the car
       CALL adjust'centers                             !adjust centers
       CALL crash'check                                !see if crash
       CALL out'track                                  !print more track
       CALL adjust'racer'data                          !keep track of others
       PRINT
       miles = miles + 0.25                            !increase odometer
       NEXT k                                          !do it again

! Find out where new racer will be placed on the track:

       IF track'course > 5 &
          THEN racer'loc = track'center - 7 &
          ELSE racer'loc = track'center + 3

! Print out new racer (takes 3 loops) while still performing same stuff

       FOR m = 1 to 3                                  !takes 3 loops:
       ON ERROR GOTO END                               !^C quit
       CALL move'car                                   !move racer
       CALL adjust'centers                             !keep track of centers
       CALL crash'check                                !see if crash
       CALL out'track                                  !print more track
       IF m = 1 THEN ? TAB(24,racer'loc) "O-M-O"       !new racer data
       IF m = 2 THEN ? TAB(24,racer'loc) " [ ]"
       IF m = 3 THEN ? TAB(24,racer'loc) "O-W-O"
       CALL adjust'racer'data                          !keep track of new car
       racer'data(24) = racer'loc+3                    !record new car loc
       miles = miles + 0.25                            !increase odometer
       NEXT m                                          !do it again
       GOTO loop                                       !now do above loop

!***************
! Subroutines:
!***************

!adjust'racer'data Subroutine - adjusts current "other racer" position(s)
adjust'racer'data:
       FOR p = 10 to 23
          racer'data(p) = racer'data(p+1)
       NEXT p
       racer'data(24) = 0
       RETURN

!out'track Subroutine - prints out 1 line of the random track
out'track:
       ? TAB(24,track'center-13);                      !tab to here
       ? track;                                        !print track
       track'course = RND(0)*10                        !get a random number
       IF track'course < 5 &
          THEN track'center = track'center - 1 &
          ELSE track'center = track'center + 1
       IF track'center < 14 &
          THEN track'center = 14                       !limit left to 14
       IF track'center > 66 &
          THEN track'center = 66                       !limit right to 66
       RETURN                                          !end of out'track

!move'car Subroutine - moves/prints out the sporty race car
move'car:
       XCALL INKEY,in'key                              !get an input key
          IF ASC(in'key) = 12  &
             THEN IF car'spot <> 72 &
               THEN car'spot=car'spot+1 : GOTO pc
          IF ASC(in'key) = 8 &
             THEN IF car'spot <> 9 &
               THEN car'spot=car'spot-1
 pc:   ? TAB(10,car'spot)"       "                     !print car out
       ? TAB(11,car'spot)top'car1
       ? TAB(12,car'spot)mid'car
       ? TAB(13,car'spot)end'car1
       RETURN

!crash'check Subroutine - see if swishy race car crashed into wall or "other"
crash'check:
       IF track'centers(14) - 13 = car'spot THEN ? CHR(7) : GOTO END
       IF track'centers(14) + 13 = car'spot + 8 THEN ? CHR(7) : GOTO END
       IF ABS(car'spot+4 - racer'data(14)) < 6 THEN ? CHR(7) : GOTO END
       RETURN

!adjust'centers Subroutine - adjusts the center of the track array
adjust'centers:
       FOR j = 12 to 23
          track'centers(j) = track'centers(j+1)
       NEXT j
       track'centers(24) = track'center
       RETURN

END:
       ? TAB(-1,28)
       ? TAB(24,20)"Total Miles: "miles