home *** CD-ROM | disk | FTP | other *** search
/ 300 Favorite Games / 300GAMES.iso / 204 / fire.prg < prev    next >
Text File  |  1995-08-14  |  4KB  |  166 lines

  1. #############################################################################
  2. #                                  FIRE                                     #
  3. #                                                                           #
  4. # This robot demonstrates the use of a bearing. CldBearings is set when     #
  5. # a robot hits another object. A collision bearing contains the relative    #
  6. # heading to the object that hits this robot (values -180 to 179 ). Remeber,#
  7. # cldbearing says nothing about the direction an object that hits this      #
  8. # robot was traveling, it only specifies where on this robot's body it      # 
  9. # hit.                                                                      #
  10. #                                                                           #
  11. # Note: This robot also contains a very usefull section that determines     #
  12. #       the smallest number of degrees needed to reach a desired angle,     #
  13. #       and another that converts a bearing to an absolute heading.         #
  14. #                                                                           #
  15. #############################################################################
  16.  
  17.  
  18. Init
  19. {
  20.     Name( "Fire" )
  21.  
  22.     RegCore( Search )
  23.     RegCldRobot( RobotHit, 1 )
  24.     RegDtcCookie( FoundCookie, 2 )
  25.     RegCldMissile( MissileHit, 3 )
  26.     RegDtcRobot( FoundRobot, 4 )
  27.  
  28.     LockGun( TRUE )
  29.     dist = 50
  30. }
  31.  
  32. Search
  33. {
  34.     Scan( )
  35.     RadarRight( 5 )
  36. }  
  37.  
  38. FoundRobot
  39. {
  40.     if( ScanDist < 50 AND energy > 50 )
  41.         Fire( 7 )
  42.     else
  43.         Fire( 1 )
  44.     endif
  45.     
  46.     Scan( )
  47. }        
  48.  
  49. MissileHit
  50. {
  51.     # Turn perpendicular to the object that nailed us
  52.     if( cldbearing < 0 )
  53.         BodyRight( cldbearing + 90 )
  54.     else
  55.         BodyRight( cldbearing - 90 )
  56.     endif
  57.     
  58.     # Run Away, Run Away
  59.     Ahead( dist )
  60.     
  61.     # Change the direction we run
  62.     dist = -dist
  63.     
  64.     # Clear out any detections that may have been lost during move
  65.     Scan( )
  66. }
  67.  
  68. RobotHit
  69. {
  70.     Stop( )
  71.  
  72.     # This converts cldbearing to an absolute heading from 0 to 359
  73.     bearing = cldbearing
  74.     Gosub( BearingToHeading )
  75.  
  76.     # Determine the smallest number of degrees to the robot that hit us
  77.     destAngle = heading
  78.     Gosub( MinDegreesRight )
  79.  
  80.     # Turn gun and radar towards the robot
  81.     GunRight( rightDegrees )
  82.  
  83.     # Check if the robot that hit us is still there.
  84.     # Note that if a robot is found, the robot detection event handler
  85.     # 'FoundRobot' will not be called until 'RobotHit' returns. This is
  86.     # because 'RobotHit' has a higher priority than 'FoundRobot'. After
  87.     # we call Scan() return so that 'FoundRobot' can handle the robot 
  88.     # detection event. This works because the the 'cldrobot' variable is
  89.     # automatically reset at the end of this section ending the cldrobot
  90.     # event.
  91.  
  92.     Scan()
  93. }
  94.  
  95. FoundCookie
  96. {
  97.     SyncAll( )
  98.     Ahead( scandist + 5 )
  99. }
  100.  
  101. # Very usefull subroutine. Changes a bearing value into an absolute
  102. # heading. Before called, this section expects 'bearing' to be filled
  103. # with the number that requires conversion. When complete, 'heading' 
  104. # will contain the converted value.
  105.  
  106. BearingToHeading
  107. {
  108.     # Do a little error checking
  109.  
  110.     if( bearing > 179 OR bearing < -180 )
  111.         Print( "BearingToHeading: bad bearing of" )
  112.         Print( bearing )
  113.         return
  114.     endif
  115.  
  116.     # BearingToHeading works with BODYAIM. This could be made 
  117.     # another user variable to make BearingToHeading more versitile.
  118.  
  119.     heading = bodyAim + bearing
  120.  
  121.     if( heading < 0 )
  122.         heading = heading + 360
  123.     elseif( heading > 359 )
  124.         heading = heading - 360
  125.     endif
  126. }
  127.  
  128.  
  129. # Very usefull subroutine. Determines the minimum number of degrees 
  130. # needed to reach 'destAngle'. Before called, this section expects
  131. # 'destAngle' to be filled with the desired angle. When complete, 
  132. # 'rightDegrees' will contain the smallest number of degrees needed
  133. # to reach destAngle turning RIGHT. If 'destAngle' can be reached 
  134. # fastest by turning LEFT, 'rightDegrees' will be negative!
  135.  
  136. MinDegreesRight
  137. {
  138.     # Do a little error checking
  139.  
  140.     if( destAngle > 359 OR destAngle < 0 )
  141.         Print( "MinDegreesRight: bad destAngle of" )
  142.         Print( destAngle )
  143.         rightDegrees = 0
  144.         return
  145.     endif
  146.  
  147.  
  148.     # MinDegreesRight works with GUNAIM. This could be made 
  149.     # another user variable to make MinDegreesRight more versitile.
  150.  
  151.     temp_right = destAngle - gunaim
  152.     
  153.     if( temp_right < 0 )
  154.         temp_right = temp_right + 360
  155.     endif
  156.     
  157.     temp_left = -temp_right + 360
  158.     
  159.     if( temp_right <= temp_left )
  160.         rightDegrees = temp_right
  161.     else
  162.         rightDegrees = -temp_left
  163.     endif
  164. }
  165.  
  166.