home *** CD-ROM | disk | FTP | other *** search
/ Classic Fond 5 / ClassicFond05_nopass.iso / STRATEGI / WINROB.RAR / MANUAL.TXT < prev    next >
Text File  |  1994-12-03  |  85KB  |  2,018 lines

  1.         ╔════════════════════════════════════════════════════════════╗
  2.         ║              ROBOT BATTLE REFERENCE MANUAL                 ║
  3.         ║                                                            ║
  4.         ║             Thank you playing robot battle!                ║
  5.         ║                                                            ║    
  6.         ║     COPYRIGHT (C) 1994 BRAD SCHICK ALL RIGHTS RESERVED     ║
  7.         ╚════════════════════════════════════════════════════════════╝
  8.  
  9.  
  10. This reference manual is provided so robot battle information may be printed
  11. as a whole. All of this information, and more, is included in on-line help.
  12. The on-line help is much more convenient for quick references. It provides
  13. searchable keywords, cross references, and is printable topic by topic.
  14.  
  15.  
  16. Table of Contents
  17. -----------------
  18.         Chapter 1.0             About Robot Battle
  19.         Chapter 2.0             The Contest
  20.         Chapter 3.0             How To Contact Me
  21.         Chapter 4.0             Creating a Robot
  22.         Chapter 5.0             Description of Robot Events
  23.         Chapter 6.0             Sample Robot
  24.         Chapter 7.0             Scripting Language Functions
  25.         Chapter 8.0             Special Sections
  26.         Chapter 9.0             Math Operators
  27.         Chapter 10.0            Logical Operators 
  28.         Chapter 11.0            Robot Variables
  29.         Chapter 12.0            User Defined Variables
  30.         Chapter 13.0            Damage Summary 
  31.         Chapter 14.0            Points Calculation 
  32.         Chapter 15.0            Tips and Techniques 
  33.  
  34.  
  35.  
  36. ══════════════════════════════════════════════════════════════════════════════
  37.                                 Chapter 1.0
  38.  
  39.                             About Robot Battle
  40. ══════════════════════════════════════════════════════════════════════════════
  41.  
  42. Can you design a robot to best all challengers? To survive, your robot
  43. must have better tactics, intelligence, and adaptability than all others.
  44. Can you out think and out gun your opponents? This is the place to find out!
  45. Build a robot and match your wits against up to five other robots in head
  46. to head battles to the death. Watch your ANIMATED robots come to life with
  47. stunning sound effects in matches of 1 to 65,500 games.
  48.  
  49. Robot creation starts by dreaming. How can your robot stay alive in an
  50. open arena with five other deadly robots hunting it down? How can you
  51. find and destroy the enemy before they find you? Of course the only way
  52. to answer these questions is trial by fire. Build a few robots and watch
  53. them get crushed by the simple sample robots provided with this game.
  54. Eventually, you will be able to match wits with other skilled robot
  55. designers.
  56.  
  57.  
  58. ══════════════════════════════════════════════════════════════════════════════
  59.                                 Chapter 2.0
  60.  
  61.                                 The Contest
  62. ══════════════════════════════════════════════════════════════════════════════
  63.  
  64. This is your chance to determine how good your robots actually are. Send in
  65. your robots to compete in a tournament against robots written by others from
  66. all over the world. Your robot will fight in hundred of games, steadily 
  67. facing tougher and tougher competition.  
  68.  
  69. The contest will be a round robin tournament. At each level, your robot will
  70. fight in many thirty game matches against various competitors. At the end of
  71. each level, total points will be tallied. Only the top one third high
  72. scoring robots will proceed to the next level of competition. 
  73.  
  74. Six robots will make it to the final level. These six robots will fight in
  75. one sixty game match to decide the overall champion. All six finalist will
  76. receive a substantial cash prize. Prize amounts will be a given percentage
  77. of total the entrance fees collected. Actual amounts will change as the
  78. number of entrants change.
  79.  
  80.         Place           Percentage      Sample Prize (assuming 200 entrants)
  81.         -----           ----------      ------------------------------------
  82.         Winner          35%                     $700
  83.         2nd Place       6%                      $120
  84.         3rd Place       6%                      $120
  85.         4th Place       6%                      $120
  86.         5th Place       6%                      $120
  87.         6th Place       6%                      $120
  88.  
  89. All contestants will receive final results. These results will contain
  90. overall contest information such as the number of contestants, the number
  91. of levels in the tournament, finalistsÆ names, championÆs name, and prize
  92. details. Contestant will also receive individual results. These will
  93. include the highest level your robot reached, the number of wins and loses
  94. during each level, score at each level, and final tournament standing.
  95.  
  96. The currently scheduled contest dates are listed below. If there is enough
  97. demand, additional contest dates will be scheduled.
  98.  
  99.         -March 1st, 1995
  100.         -November 1st, 1995
  101.  
  102. Send in as many robots as you like. Each robot has a 10$ registration fee.
  103. Remember, you do not have to Register the game itself to enter the contest.
  104. Anyone may enter! All robots must be properly prepared before entry. To
  105. prepare a robot for contest entry, run the 'contest.exe' program included
  106. with the game.
  107.  
  108. Once your have prepared your robots for entry, you must send them in. See 
  109. Chapter 3.0 for more information about getting your robots to me. Also, let 
  110. me know if you would like contests with other formats in the future. For 
  111. example, I could also organize one-on-one tournaments.
  112.  
  113.  
  114.  
  115. ══════════════════════════════════════════════════════════════════════════════
  116.                                 Chapter 3.0
  117.  
  118.                              How to Contact Me
  119. ══════════════════════════════════════════════════════════════════════════════
  120.  
  121. The following is a list of way to contact me if you need to do any of the
  122. following:
  123.         - Enter robots in The Contest
  124.         - Give suggestions for Version 2
  125.         - Report problems
  126.         - Get technical support
  127.         - Ask other questions.
  128.  
  129. Additional Contest Information:
  130.         To enter The Contest using CompuServe, America Online, or the
  131.         Internet, send an email containing your prepared robots. To enter
  132.         using the Robot Battle BBS, simple upload your prepared robots.
  133.         Before sending in your robots, they must be prepared using the
  134.         'contest.exe' program included with this game. If you are paying
  135.         the entrance fee using VISA or MasterCard, prepared robots are all
  136.         you need to send. If you are paying the entrance fee with a check
  137.         or money order, you must send the payment separately via Standard
  138.         Mail.
  139.  
  140.  
  141. Standard Mail
  142.         Brad Schick
  143.         PO Box 14056
  144.         Chicago, IL 60614-0056
  145.  
  146. Robot Battle BBS (BBS Info)
  147.         Robot Battle BBS:               (312) 975-9392
  148.         Max. BPS                        14.4K
  149.         Data                            8
  150.         Parity                          None
  151.         Stop Bits                       1
  152.         Terminal Type                   ANSI
  153.  
  154. CompuServe
  155.         75573,1112
  156.  
  157. America Online
  158.         robotbtl
  159.  
  160. The Internet
  161.         robotblt@aol.com
  162.         75573.1112@compuserve.com
  163.  
  164.  
  165.  
  166. ══════════════════════════════════════════════════════════════════════════════
  167.                                 Chapter 4.0
  168.  
  169.                               Creating a Robot
  170. ══════════════════════════════════════════════════════════════════════════════
  171.  
  172. Robots are created using a simple scripting language. All you need is
  173. an ASCII text editor and an imagination. Although helpful, no previous
  174. programming knowledge is required. In fact, Robot Battle is a great way
  175. to start learning how to program. Most modern computer systems are based
  176. on event driven techniques very similar to those you will learn playing
  177. Robot Battle.  
  178.  
  179. To create your own robot, start by looking at the Sample Robot below. Do
  180. not worry about the specific commands, they are described in Scripting 
  181. Lanuguage chapter. Just get the feel for the layout of a robot's
  182. instructions.
  183.  
  184. Once you have looked over the Sample Robot, move on to the Scripting 
  185. Lanuguage chapter. It provides detailed explanations of all robot 
  186. operations. Again, do not get too hung up on the specifics. The best way
  187. to learn is by examining prefabricated robots and actually playing the
  188. game. Robot Battle comes with many thoroughly commented sample robots. Use
  189. a text editor to view their instructions, then start the game and watch
  190. them slug it out in the arena!
  191.  
  192.  
  193. ══════════════════════════════════════════════════════════════════════════════
  194.                                 Chapter 5.0
  195.  
  196.                          Description of Robot Events
  197. ══════════════════════════════════════════════════════════════════════════════
  198.  
  199. The most important concept to robot design is event driven behavior. Event
  200. driven means that robots behave by responding to things (events) that
  201. happen to them. Designing an event driven robot involves deciding what
  202. events a robot should respond to and how it will respond. Responding to an
  203. event is commonly referred to as handling an event.
  204.  
  205. A robot is divided into a number of sections. Each section has a name and
  206. instructions associated with that name. Sections are grouped by curly
  207. brackets {}. See the sample robot below, to see actual sections. Sections
  208. are used to handle events. Events are associated with sections by various
  209. registration functions described below.
  210.  
  211. The sections used to handle events define how a robot will behave. Events
  212. may be re-registered to new handler sections at any time. This allows for
  213. extremely flexible robots. At any time during a game, a robot may
  214. re-register its event handlers, completely changing its behavior. Once
  215. registered, events may also be individually turned on or off.
  216.  
  217. Events also have a priority associated with them. Since a robot can only
  218. do one thing a time, it handles higher priority events first. When an event
  219. occurs, and no higher priority events are occurring, the section registered
  220. to handle that event is called.
  221.  
  222. When a handler section is called, it always executes to either the last line
  223. of code in that section or until a Return statement is hit. This does not
  224. mean execution will always go directly from the first to the last line of a
  225. handler section, however. Handlers may always be preempted by higher
  226. priority events. If an event with a higher priority than the current event
  227. happens, its event handler will be called immediately. The lower priority
  228. handler will not continue execution until the higher priority event handler
  229. completes.
  230.  
  231. The sample robot called æevent.prgÆ should be very helpful. Look at its
  232. instructions, then run it in a game. Look at its output in the Robot
  233. Information Dialog to verify that all events have occurred as expected.
  234.  
  235.  
  236. ══════════════════════════════════════════════════════════════════════════════
  237.                                 Chapter 6.0
  238.  
  239.                                 Sample Robot
  240. ══════════════════════════════════════════════════════════════════════════════
  241.  
  242. Notice that capitalization is not important. A variable named "VARIABLE"
  243. will be that same as "variable" or "Variable". This is also true for robot
  244. functions and section names.
  245.  
  246.  
  247. Init                                    # Init section 
  248. {
  249.         Name( "Sample" )                # Sets robotÆs name
  250.  
  251.         RegCore( Core )                 # Registers core event handler
  252.         RegCldMissile( MissileHit,1 )   # Registers missile hit handler
  253.         RegDtcRobot( FoundRobot, 2 )    # Registers robot detection handler
  254.  
  255.         fire_engy = 1                   # User defined variable: fire_engy
  256.         LockGun( ON )                   # Locks gun and radar together
  257. }
  258.  
  259. Core                                    # Core section
  260. {
  261.         Scan( )                         # Looks for other objects
  262.         RadarRight( 5 )                 # Turns radar (and gun) right
  263. }  
  264.  
  265. MissileHit                              # MissileHit section
  266. {
  267.         Ahead( 20 )                     # Moves robot ahead
  268. }
  269.  
  270. FoundRobot                              # FoundRobot section
  271. {
  272.         fire( fire_engy )               # Fires energy missile
  273.         Scan()                          # Looks for other objects
  274. }
  275.  
  276.  
  277. ══════════════════════════════════════════════════════════════════════════════
  278.                                 Chapter 7.0
  279.  
  280.                         Scripting Language Functions
  281. ══════════════════════════════════════════════════════════════════════════════
  282.  
  283. These functions make up the robot scripting language. They are used to tell 
  284. a robot what it should do.  Parameters are the values that are passed into a 
  285. function.  Different functions take different numbers of parameters. No robot
  286. functions return values.  The functions below are grouped roughly by the 
  287. services they provide. Remember, capitalization is used for clarity only, 
  288. Robot Battle does not recognized capitalization.
  289.  
  290. ** Parameters marked with two stars may be any valid expression. Expressions 
  291.    are composed of variables, numeric values, math operators, and logical 
  292.    operators.
  293.  
  294.  
  295. Function Summary
  296. ----------------
  297. Ahead                   Moves the robot ahead
  298. AscanEvents             Turns on or off auto scanning events
  299. Back                    Moves the robot back
  300. Blocking                Turns command blocking on or off
  301. BodyLeft                Turns the robot to the left
  302. BodyRight               Turns the robot to the right
  303. CldCookieEvents         Turns on or off cookie collision events
  304. CldMineEvents           Turns on or off mine collision events
  305. CldMissileEvents        Turns on or off missile collision events
  306. CldRobotEvents          Turns on or off robot collision events
  307. Continue                Continues previously aborted movement
  308. CoreEvents              Turns on or off core events
  309. CustomEvents            Turns on or off custom events
  310. DtcCookieEvents         Turns on or off cookie detection events
  311. DtcMineEvents           Turns on or off mine detection events
  312. DtcRobotEvents          Turns on or off robot detection events
  313. Else                    Evaluated when previous the If() or ElseIf() is false
  314. ElseIf                  Evaluated when previous the If() is false
  315. Endif                   Marks the end of a logical the If() block
  316. Fire                    Fires an energy missile
  317. GetHitsOther            Determines the number of times the robot has hit another robot
  318. GetHitsSelf             Determines the number of times the robot has been hit by energy missles
  319. GetHitStr               Determines the average damage done by the robotÆs missiles
  320. GetOthers               Counts the number of other robots left in a game
  321. GetRandom               Generates a random number
  322. GetShots                Determines the number of energy missiles fired by the robot
  323. GetTurns                Determines the number of turns the robot has had
  324. Gosub                   Causes execution to continue in another section
  325. GunLeft                 Turns the robots gun to the left
  326. GunRight                Turns the robots gun to the right
  327. If                      Starts a logical If block
  328. LockAll                 Turns rotation locking on for all robot components
  329. LockGun                 Turns rotation locking on for the robotÆs gun and radar
  330. Name                    Sets the robotÆs name
  331. Print                   Adds a string to the output display window
  332. Print                   Adds a variable to the output display window
  333. RadarLeft               Turns the robotÆs radar to the left
  334. RadarRight              Turns the robotÆs radar to the right
  335. RegAscan                Registers an event handler for auto scanning
  336. RegCldCookie            Registers an event handler for collision with energy cookies
  337. RegCldMine              Registers an event handler for collision with energy mines
  338. RegCldMissile           Registers an event handler for collision with energy missiles
  339. RegCldRobot             Registers an event handler for collision with other robots
  340. RegCore                 Registers an event handler for the robotÆs core behavior
  341. RegCustom               Registers an event handler for custom defined events
  342. RegDtcCookie            Registers an event handler for detection of energy cookies
  343. RegDtcMine              Registers an event handler for detection of energy mines
  344. RegDtcRobot             Registers an event handler for detection of other robots
  345. Return                  Causes current section to end at the current line
  346. Round                   Rounds the specified value
  347. Scan                    Sends out a radar ping to search for other objects
  348. SetAccel                Sent the robots lateral acceleration
  349. Stall                   Causes robot to freeze
  350. Stop                    Causes robot to abort further movement
  351. Store                   Stores values for retrieval in later games
  352. SyncAll                 Aligns the robot's body and gun to its radar
  353. SyncGun                 Aligns the robot's gun to its radar
  354. Truncate                Truncates the specified value
  355. WaitFor                 Creates a user defined block
  356.  
  357.  
  358. Function Details
  359. ----------------
  360. RegCore( section )
  361.      
  362.      section   - Name of a section in the robot script
  363.      
  364.      Registers an event handler for the robot's core
  365.      behavior.  Core events occur when no other events are
  366.      happening.  In other words, this section is called
  367.      repeatedly until the robot dies.  The core section may
  368.      be re-registered at any time during a game to change
  369.      the robot's core behavior.  All other registered events
  370.      have higher priorities that the core event.
  371.      
  372.      Note: When an event handler is registered or re-
  373.      registered, it becomes immediately active.
  374.      
  375.  
  376. RegAscan( section, priority )
  377.  
  378.      section    - Name of a section in the robot script
  379.      priority   - Importance of event relative to others 
  380.                   (lower numbers have higher priority) **
  381.  
  382.      Registers an event handler for auto scanning. Auto 
  383.      scanning events occurs only when a robot is moving. 
  384.      Auto scanning provides robots an opportunity to 
  385.      continue searching for other objects while moving.  
  386.      When an auto scan event handler is registered, it 
  387.      will be called repeatedly while the robot is moving 
  388.      and no higher priority events are occurring. The 
  389.      priority value should be a whole number, decimals
  390.      will be dropped. If two events registered with the 
  391.      same priority occur at the same time, it is unspecified 
  392.      which event handler will be called. This applies to 
  393.      lateral movement only, not rotation. Both the Ahead 
  394.      and Back functions have no meaning in a section 
  395.      handling auto scan events.  
  396.  
  397.      Auto scan events are triggered by the moving variable. 
  398.      This variable is always true while a robot is moving 
  399.      laterally and false while it is stationary or only 
  400.      rotating.
  401.  
  402.      Note: When an event handler is registered or re-
  403.      registered, it becomes immediately active.
  404.      
  405.  
  406. RegCldRobot( section, priority )
  407.      
  408.      section   - Name of a section in the robot script
  409.      priority  - Importance of this event relative to others
  410.                  (lower numbers have higher priority)**
  411.      
  412.      Registers an event handler for collisions with other
  413.      robots.  The section specified above will be called
  414.      whenever the robot runs into another robot and no other
  415.      higher priority events are occurring. The priority
  416.      value should be a whole number, decimals will be
  417.      dropped.  If two events registered with the same
  418.      priority occur at the same time, it is unspecified
  419.      which event handler will be called. Hitting another
  420.      robot will result in an energy loss of 1 point to each
  421.      robot.
  422.      
  423.      Robot collision events are triggered by the cldrobot
  424.      variable.  When a robot collision event handler
  425.      returns, the cldrobot variable is automatically set to
  426.      false causing the event to end.
  427.      
  428.      Note: When an event handler is registered or re-
  429.      registered, it becomes immediately active.
  430.      
  431.  
  432. RegCldMissile( section, priority )
  433.      
  434.      section   - Name of a section in the robot script
  435.      priority  - Importance of this event relative to others
  436.                  (lower numbers have higher priority)**
  437.      
  438.      Registers an event handler for collisions with energy
  439.      missiles fired by other robots.  The section specified
  440.      above will be called whenever the robot is hit by an
  441.      energy missile and no other higher priority events are
  442.      occurring. The priority value should be a whole number,
  443.      decimals will be dropped.  If two events registered
  444.      with the same priority occur at the same time, it is
  445.      unspecified which event handler will be called. The
  446.      amount of damage done by an energy missile depends upon
  447.      both the amount of energy put into it and the distance
  448.      it has traveled.
  449.      
  450.      Missile collision events are triggered by the
  451.      cldmissile variable. When a missile collision event
  452.      handler returns, the cldmissile variable is
  453.      automatically set to false causing the event to end.
  454.      
  455.      Note: When an event handler is registered or re-
  456.      registered, it becomes immediately active.
  457.      
  458.  
  459. RegCldCookie( section, priority )
  460.      
  461.      section   - Name of a section in the robot script
  462.      priority  - Importance of this event relative to others
  463.                  (lower numbers have higher priority)**
  464.      
  465.      Registers an event handler for collisions with energy
  466.      cookies.  The section specified above will be called
  467.      whenever the robot runs into an energy cookie and no
  468.      other higher priority events are occurring. The
  469.      priority value should be a whole number, decimals will
  470.      be dropped.  If two events registered with the same
  471.      priority occur at the same time, it is unspecified
  472.      which event handler will be called.  Hitting an energy
  473.      cookie will result in an energy gain of 20 point.
  474.      
  475.      Cookie collision events are triggered by the cldcookie
  476.      variable.  When a cookie collision event handler
  477.      returns, the cldcookie variable is automatically set to
  478.      false causing the event to end.
  479.      
  480.      Note: When an event handler is registered or re-
  481.      registered, it becomes immediately active.
  482.      
  483.  
  484. RegCldMine( section, priority )
  485.      
  486.      section   - Name of a section in the robot script
  487.      priority  - Importance of this event relative to others
  488.                  (lower numbers have higher priority)**
  489.      
  490.      Registers an event handler for collisions with energy
  491.      mines.  The section specified above will be called
  492.      whenever the robot runs into an energy mine and no
  493.      other higher priority events are occurring. The
  494.      priority value should be a whole number, decimals will
  495.      be dropped.  If two events registered with the same
  496.      priority occur at the same time, it is unspecified
  497.      which event handler will be called. Hitting an energy
  498.      mine will result in an energy loss of 20 point.
  499.      
  500.      Mine collision events are triggered by the cldmine
  501.      variable.  When a mine collision event handler returns,
  502.      the cldmine variable is automatically set to false
  503.      causing the event to end.
  504.      
  505.      Note: When an event handler is registered or re-
  506.      registered, it becomes immediately active.
  507.      
  508.  
  509. RegDtcRobot( section, priority )
  510.      
  511.      section   - Name of a section in the robot script
  512.      priority  - Importance of this event relative to others
  513.                  (lower numbers have higher priority)**
  514.      
  515.      Registers an event handler for detection of another
  516.      robot.  The section specified above will be called
  517.      whenever another robot is detected by a call to Scan()
  518.      and no other higher priority events are occurring. The
  519.      priority value should be a whole number, decimals will
  520.      be dropped. If two events registered with the same
  521.      priority occur at the same time, it is unspecified
  522.      which event handler will be called.
  523.      
  524.      Robot detection events are triggered by the dtcrobot
  525.      variable.  When a robot detection event handler
  526.      returns, the dtcrobot variable is automatically
  527.      decremented by one potentially causing the event to
  528.      end.
  529.      
  530.      Note: When an event handler is registered or re-
  531.      registered, it becomes immediately active.
  532.      
  533.      
  534. RegDtcCookie( section, priority )
  535.      
  536.      section   - Name of a section in the robot script
  537.      priority  - Importance of this event relative to others
  538.                  (lower numbers have higher priority)**
  539.      
  540.      Registers an event handler for detection of energy
  541.      cookies.  The section specified above will be called
  542.      whenever an energy cookie is detected by a call to
  543.      Scan() and no other higher priority events are
  544.      occurring. The priority value should be a whole number,
  545.      decimals will be dropped. If two events registered with
  546.      the same priority occur at the same time, it is
  547.      unspecified which event handler will be called.
  548.      
  549.      Cookie detection events are triggered by the dtccookie
  550.      variable.  When a cookie detection event handler
  551.      returns, the dtccookie variable is automatically
  552.      decremented by one potentially causing the event to
  553.      end.
  554.      
  555.      Note: When an event handler is registered or re-
  556.      registered, it becomes immediately active.
  557.      
  558.  
  559. RegDtcMine( section, priority )
  560.      
  561.      section   - Name of a section in the robot script
  562.      priority  - Importance of this event relative to others
  563.                  (lower numbers have higher priority)**
  564.      
  565.      Registers an event handler for detection of energy
  566.      mines.  The section specified above will be called
  567.      whenever an energy mine is detected by a call to Scan()
  568.      and no other higher priority events are occurring. The
  569.      priority value should be a whole number, decimals will
  570.      be dropped. If two events registered with the same
  571.      priority occur at the same time, it is unspecified
  572.      which event handler will be called.
  573.      
  574.      Mine detection events are triggered by the dtcmine
  575.      variable.  When a mine detection event handler returns,
  576.      the dtcmine variable is automatically decremented by
  577.      one potentially causing the event to end.
  578.      
  579.      Note: When an event handler is registered or re-
  580.      registered, it becomes immediately active.
  581.      
  582.  
  583. RegCustom( section, priority, expression )
  584.      
  585.      section   - Name of a section in the robot script
  586.      priority  - Importance of this event relative to others
  587.                  (lower numbers have higher priority)**
  588.      expression - Expression that evaluates to True 
  589.                   (non-zero) or False (zero)**
  590.      
  591.      Registers an event handler for a custom defined event.
  592.      The custom event occurs whenever the provided
  593.      expression evaluates to true and no other higher
  594.      priority events are occurring.  The expression may be
  595.      composed of any legal variables, math operators, or
  596.      logical statements.  Any expression that is legal
  597.      inside an If() statement may also be used as a custom
  598.      event. The priority value should be a whole number,
  599.      decimals will be dropped.  If two events registered
  600.      with the same priority occur at the same time, it is
  601.      unspecified which event handler will be called.
  602.      
  603.      Each section may only have one custom event attached to
  604.      it.  There may be any combination of standard events,
  605.      but only one custom event per section.  When two custom
  606.      events need to use the same section, the events may be
  607.      combined into one with an OR statement.  Alternatively,
  608.      two small helper sections could be created that both
  609.      use Gosub() calls to share the same logic.  When
  610.      multiple custom events are registered to one section,
  611.      only the last one will apply.
  612.      
  613.      Unlike "standard" events, custom events are not ended
  614.      automatically.  For example, when a section registered
  615.      to handle collision events returns, the collision
  616.      variable is reset to false ending the event.  When a
  617.      custom event handler returns, is has no effect on the
  618.      state of the custom event.  If events are not ended
  619.      somehow, the handler section will execute continuously.
  620.      
  621.      Note: When an event handler is registered or re-
  622.      registered, it becomes immediately active.
  623.      
  624.      
  625. CoreEvents( bool )
  626.      
  627.      bool - True (non-zero) or False (zero) value **
  628.      
  629.      Used to either turn on or off handling of core events
  630.      (core events occur when no other events are occurring).
  631.      This function does not effect which section handles
  632.      core events, only whether the events are handled or
  633.      ignored.  The event handler section may be changed by
  634.      another call to RegCore().
  635.      
  636.  
  637. AscanEvents( bool )
  638.      
  639.      bool - True (non-zero) or False (zero) value **
  640.      
  641.      Used to either turn on or off handling of auto scan
  642.      events.  This function does not effect which section
  643.      handles auto scan events, only whether the events are
  644.      handled or ignored.  The event handler section may be
  645.      changed by another call to RegAscan().
  646.      
  647.  
  648. CldRobotEvents( bool )
  649.      
  650.      bool - True (non-zero) or False (zero) value **
  651.      
  652.      Used to either turn on or off handling of robot
  653.      collision events.  This function does not effect which
  654.      section handles robot collision events, only whether
  655.      the events are handled or ignored.  The event handler
  656.      section may be changed by another call to
  657.      RegCldRobot().
  658.      
  659.  
  660. CldMissileEvents( bool )
  661.      
  662.      bool - True (non-zero) or False (zero) value **
  663.      
  664.      Used to either turn on or off handling of missile
  665.      collision events.  This function does not effect which
  666.      section handles missile collision events, only whether
  667.      the events are handled or ignored.  The event handler
  668.      section may be changed by another call to
  669.      RegCldMissile().
  670.      
  671.  
  672. CldCookieEvents( bool )
  673.      
  674.      bool - True (non-zero) or False (zero) value **
  675.      
  676.      Used to either turn on or off handling of energy cookie
  677.      collision events.  This function does not effect which
  678.      section handles cookie collision events, only whether
  679.      the events are handled or ignored.  The event handler
  680.      section may be changed by another call to
  681.      RegCldCookie().
  682.      
  683.  
  684. CldMineEvents( bool )
  685.      
  686.      bool - True (non-zero) or False (zero) value **
  687.      
  688.      Used to either turn on or off handling of energy mine
  689.      collision events.  This function does not effect which
  690.      section handles mine collision events, only whether the
  691.      events are handled or ignored.  The event handler
  692.      section may be changed by another call to RegCldMine().
  693.      
  694.  
  695. DtcRobotEvents( bool )
  696.      
  697.      bool - True (non-zero) or False (zero) value **
  698.      
  699.      Used to either turn on or off handling of robot
  700.      detection events.  This function does not effect which
  701.      section handles robot detection events, only whether
  702.      the events are handled or ignored.  The event handler
  703.      section may be changed by another call to
  704.      RegDtcRobot().
  705.  
  706.  
  707. DtcCookieEvents( bool )
  708.      
  709.      bool - True (non-zero) or False (zero) value **
  710.      
  711.      Used to either turn on or off handling of energy cookie
  712.      detection events.  This function does not effect which
  713.      section handles cookie detection events, only whether
  714.      the events are handled or ignored.  The event handler
  715.      section may be changed by another call to
  716.      RegDtcCookie().
  717.  
  718.  
  719. DtcMineEvents( bool )
  720.  
  721.      bool - True (non-zero) or False (zero) value **
  722.      
  723.      Used to either turn on or off handling of energy mine
  724.      detection events.  This function does not effect which
  725.      section handles mine detection events, only whether the
  726.      events are handled or ignored.  The event handler
  727.      section may be changed by another call to RegDtcMine().
  728.  
  729.  
  730. CustomEvents( section, bool )
  731.      
  732.      section - Name a section in the robot script
  733.      bool    - True (non-zero) or False (zero) value **
  734.      
  735.      Used to either turn on or off handling of a specific
  736.      custom event.  Since there may be many registered
  737.      custom events, the specific event must be identified by
  738.      its handler section.  This function does not effect
  739.      which section handles the custom event, only whether
  740.      the event is handled or ignored.  Custom events may not
  741.      really be re-registered.  To move a custom event to a
  742.      different handler, turn off the custom event using this
  743.      function (or register a new custom event to the
  744.      section) then call RegCustom() to register a different
  745.      handler.
  746.      
  747.  
  748. SetAccel( accel )
  749.      
  750.      accel     - Acceleration value **
  751.      
  752.      Sets the robot's lateral acceleration to a value
  753.      between 1 and 5.  While moving robots are constantly
  754.      accelerating, so this value approximately represents a
  755.      robot's speed.  This function changes the accel
  756.      variable described below.  If this function is never
  757.      called, a robot's acceleration defaults to 3.
  758.      
  759.  
  760. Ahead( dist )
  761.      
  762.      dist - Distance to move **
  763.      
  764.      Moves the robot ahead the specified amount.  If the
  765.      amount is negative, the robot will move backward.
  766.      Running into another robot will cause damage to both
  767.      robots in the collision.  Each robot will lose one
  768.      energy point per collision.  Hitting a wall will stop a
  769.      robot, but causes no damage.
  770.      
  771.      Note:  The playing arena is a square measuring 400 unit
  772.      in both directions while robots measure 33 units in
  773.      both directions. Ahead() requires multiple turns to complete, 
  774.      therefore causing command blocking (see command blocking).
  775.  
  776.  
  777. Back( dist )
  778.      
  779.      dist - Distance to move **
  780.      
  781.      Moves the robot back the specified amount.  If the
  782.      amount is negative, the robot will move forward.
  783.      Running into another robot will cause damage to both
  784.      robots in the collision.  Each robot will lose one
  785.      energy point per collision.  Hitting a wall will stop a
  786.      robot, but causes no damage.
  787.      
  788.      Note:  The playing arena is a square measuring 400 unit
  789.      in both directions while robots measure 33 units in
  790.      both directions. Back() requires multiple turns to complete, 
  791.      therefore causing command blocking (see command blocking).
  792.      
  793.  
  794. Stop( )
  795.  
  796.      Causes the robot to abort further movement. This includes 
  797.      both lateral and rotational movement. This function is useful 
  798.      during an event handling routine. When a new event occurs, 
  799.      all movement will continue unless Stop or a new movement 
  800.      function is called. 
  801.  
  802.      This function stores both the incomplete lateral movement 
  803.      and rotations from the aborted movement in a continue buffer.
  804.      This continue buffer is used by the Continue() function 
  805.      described below.  
  806.  
  807.      Note:  If Stop() is called when no motion is occurring, the 
  808.      continue buffer is left unchanged. Each time Stop() aborts 
  809.      movement, however, the previous continue buffer is overwritten.
  810.  
  811.  
  812. Continue( )
  813.  
  814.      Continues all movement previously aborted by a call to 
  815.      Stop(). This includes both lateral movement and rotations. 
  816.      Calling Continue() also resets the continue buffer.
  817.  
  818.      This function only continues aborted movement, it does not 
  819.      restore location. For example, if a robot rotates or moves 
  820.      laterally between calls to Stop() and Continue(), movement 
  821.      will be continued from the new location and orientation.
  822.  
  823.      Note:  Just like other commands that cause movement, 
  824.      Continue() requires multiple turns to complete, therefore 
  825.      causing command blocking (see command blocking).
  826.  
  827.  
  828. BodyLeft( degrees )
  829.      
  830.      degrees   - Degrees to rotate body **
  831.      
  832.      Turns the robot's body counter-clockwise by the amount
  833.      specified. Negative values will cause clockwise
  834.      rotation. The maximum rotation rate of a robotÆs body is
  835.      5 degrees per turn.
  836.      
  837.      Note: Rotation speeds of a robot's body, gun, and radar
  838.      differ.  A robot's body rotates the slowest, its gun
  839.      rotates twice as fast as its body, and its radar
  840.      rotates three times as fast as its body. BodyLeft() 
  841.      requires multiple turns to complete, therefore causing 
  842.      command blocking (see command blocking).
  843.      
  844.  
  845. BodyRight( degrees )
  846.      
  847.      degrees   - Degrees to rotate body **
  848.      
  849.      Turns the robot's body clockwise by the amount
  850.      specified. Negative values will cause counter-clockwise
  851.      rotation. The maximum rotation rate of a robotÆs body is
  852.      5 degrees per turn.
  853.      
  854.      Note: Rotation speeds of a robot's body, gun, and radar
  855.      differ.  A robot's body rotates the slowest, its gun
  856.      rotates twice as fast as its body, and its radar
  857.      rotates three times as fast as its body. BodyRight() 
  858.      requires multiple turns to complete, therefore causing 
  859.      command blocking (see command blocking).
  860.  
  861.  
  862. GunLeft( degrees )
  863.      
  864.      degrees   - Degrees to rotate gun **
  865.      
  866.      Turns the robot's gun counter-clockwise by the amount
  867.      specified. Negative values will cause clockwise
  868.      rotation. The maximum rotation rate of a robotÆs gun 
  869.      is 10 degrees per turn.
  870.      
  871.      Note: Rotation speeds of a robot's body, gun, and radar
  872.      differ.  A robot's body rotates the slowest, its gun
  873.      rotates twice as fast as its body, and its radar
  874.      rotates three times as fast as its body. GunLeft() 
  875.      requires multiple turns to complete, therefore causing 
  876.      command blocking (see command blocking).
  877.      
  878.  
  879. GunRight( degrees )
  880.      
  881.      degrees   - Degrees to rotate gun **
  882.      
  883.      Turns the robot's gun clockwise by the amount
  884.      specified. Negative values will cause counter-clockwise
  885.      rotation. The maximum rotation rate of a robotÆs gun 
  886.      is 10 degrees per turn.
  887.      
  888.      Note: Rotation speeds of a robot's body, gun, and radar
  889.      differ.  A robot's body rotates the slowest, its gun
  890.      rotates twice as fast as its body, and its radar
  891.      rotates three times as fast as its body. GunRight() 
  892.      requires multiple turns to complete, therefore causing 
  893.      command blocking (see command blocking).
  894.      
  895.  
  896. RadarLeft( degrees )
  897.      
  898.      degrees   - Degrees to rotate radar **
  899.      
  900.      Turns the robot's radar counter-clockwise by the amount
  901.      specified. Negative values will cause clockwise
  902.      rotation. The maximum rotation rate of a robotÆs radar 
  903.      is 15 degrees per turn.
  904.      
  905.      Note: Rotation speeds of a robot's body, gun, and radar
  906.      differ.  A robot's body rotates the slowest, its gun
  907.      rotates twice as fast as its body, and its radar
  908.      rotates three times as fast as its body. RadarLeft() 
  909.      requires multiple turns to complete, therefore causing 
  910.      command blocking (see command blocking).
  911.      
  912.  
  913. RadarRight( degrees )
  914.      
  915.      degrees   - Degrees to rotate radar **
  916.      
  917.      Turns the robot's radar clockwise by the amount
  918.      specified. Negative values will cause counter-clockwise
  919.      rotation. The maximum rotation rate of a robotÆs radar 
  920.      is 15 degrees per turn.
  921.      
  922.      Note: Rotation speeds of a robot's body, gun, and radar
  923.      differ.  A robot's body rotates the slowest, its gun
  924.      rotates twice as fast as its body, and its radar
  925.      rotates three times as fast as its body. RadarRight() 
  926.      requires multiple turns to complete, therefore causing 
  927.      command blocking (see command blocking).
  928.      
  929.  
  930. LockAll( bool )
  931.      
  932.      bool - True (non-zero) or False (zero) value **
  933.      
  934.      Turns on or off rotational locking of all robot
  935.      components (body, radar, and gun).  Turning locking on
  936.      causes all components to rotate together at body
  937.      rotation speeds.  For example, with locking on, calling
  938.      the RadarLeft() function will cause the entire robot to
  939.      turn left by the specified amount.  Remember, both the
  940.      gun and radar are forced to rotate at slower body
  941.      rotation speeds.
  942.      
  943.  
  944. LockGun( bool )
  945.      
  946.      bool - True (non-zero) or False (zero) value **
  947.      
  948.      Turns on or off rotational locking of a robot's gun and
  949.      radar.  Turning locking on causes the gun and radar to
  950.      rotate together at gun rotation speeds.  For example,
  951.      with locking on, calling the RadarLeft() function will
  952.      cause both the gun and radar turn left by the specified
  953.      amount.  Remember, the radar is forced to rotate at
  954.      slower gun rotation speeds.
  955.  
  956.  
  957. SyncAll()
  958.      
  959.      Synchronizes both the robot's body and gun to the
  960.      current radar angle.  This function will temporarily
  961.      override any rotation locks established by previous
  962.      calls to LockAll() and LockGun().
  963.      
  964.      Note: SyncAll() requires multiple turns to complete, 
  965.      therefore causing command blocking (see command blocking).
  966.      
  967.  
  968. SyncGun()
  969.      
  970.      Synchronizes the robot's gun to the current radar
  971.      angle.  This function will temporarily override any
  972.      rotation locks established by previous calls to
  973.      LockAll() and LockGun().
  974.      
  975.      Note: SyncGun() requires multiple turns to complete, 
  976.      therefore causing command blocking (see command blocking).
  977.      
  978.  
  979. Scan()
  980.      
  981.      Sends out a radar "ping" in the direction of the radar.
  982.      The ping travels in a straight line away from the
  983.      robot.  The distance of the first obstacle encountered
  984.      is placed in the scandist variable described below.
  985.      Distance is measured from the robot's boundary to the
  986.      boundary of the other object or wall.  If the first
  987.      obstacle is another robot, mine, or cookie the
  988.      dtcrobot, dtcmine, or, dtccookie variable will be
  989.      incremented respectively.  This may cause event
  990.      handlers to be called. Every time Scan() is called,
  991.      both the dtcenergy and dtcbearing variables are changed
  992.      as well.
  993.      
  994.  
  995. Fire( energy )
  996.      
  997.      energy    - Amount of energy to use **
  998.      
  999.      Fires an energy missile in the direction of the robot's
  1000.      gun.  The amount of damage done by an energy missile is
  1001.      directly proportional to the amount of energy used to
  1002.      fire it and the distance the missile travels.  Energy
  1003.      used to fire a missile is removed from the robot's
  1004.      overall energy store.  Valid firing values are from 1
  1005.      to 7.  Zero is ignored, negative numbers cause an
  1006.      error, and values greater that 7 are simply reduced to
  1007.      7.  Remember, energy missiles lose energy as they
  1008.      travel.  Hitting targets at a great distance has a
  1009.      smaller effect than hitting close targets.
  1010.      
  1011.      After firing an energy missile, a robot's gun requires 
  1012.      time to cool down. Fire() may be called continuously, but 
  1013.      nothing will happen until the gun cools down. Although 
  1014.      most robots just ignore this and call Fire() as often as 
  1015.      required, the gunheat variable can be used to determine 
  1016.      the current heat of the gun.
  1017.      
  1018.      Note: An energy missile's total energy is the amount of
  1019.      energy put into a missile multiplied by 4. Although a
  1020.      missile loses energy as it travels, its strength will
  1021.      never go below 4.  The damage done to another robot
  1022.      will never go below 5 since 1 point is also lost due to
  1023.      the collision.
  1024.      
  1025.  
  1026. If( expression )
  1027.      
  1028.      expression - Expression that evaluates to True 
  1029.                   (non-zero) or False (zero)**
  1030.      
  1031.      Used to start a logical if block based upon the value
  1032.      of an expression.  If() blocks may be nested, but there
  1033.      should only be one If() statement opening each block.
  1034.      The expression may contain any legal variable, numeric
  1035.      value, logical operator, or math operator.
  1036.      
  1037.  
  1038. Elseif( expression )
  1039.      
  1040.      expression - Expression that evaluates to True 
  1041.                   (non-zero) or False (zero)**
  1042.      
  1043.      Evaluated if the opening If() or previous Elseif()
  1044.      statement in a logical If() block evaluates to false.
  1045.      Behaves exactly like an If() statement, but may not be
  1046.      the first statement in a logical if block.  There may
  1047.      be multiple Elseif() statements in a single block. The
  1048.      expression may contain any legal variable, numeric
  1049.      value, logical operator, or math operator.
  1050.  
  1051.  
  1052. Else
  1053.      
  1054.      Evaluated when the all previous If() and Elseif()
  1055.      statements in a logical If() block have evaluated to
  1056.      false.  If() blocks may be nested, but there may only
  1057.      be one Else statement in each block.
  1058.  
  1059.  
  1060. Endif
  1061.  
  1062.      Marks the end of a logical If() block.  If() blocks may
  1063.      be nested, but there may only be one Endif statement
  1064.      ending each block.
  1065.      
  1066.  
  1067. Gosub( section )
  1068.      
  1069.      section   - Name of a section in the robot script
  1070.      
  1071.      Causes execution to continue at the first line of the
  1072.      specified section.  When the called section finishes
  1073.      its last line or hits a Return statement, execution
  1074.      continues at the line after the Gosub() call.
  1075.      
  1076.      Note: Sections that are executed with a Gosub() command 
  1077.      inherit the priority of their callers. This implies 
  1078.      that sections executed with the Gosub() command have
  1079.      no unexpected effect on events; they behave exactly as 
  1080.      their callers behave. 
  1081.      
  1082.  
  1083. Return
  1084.      
  1085.      Causes the current section to end at the current line,
  1086.      returning to the caller.  If there was no explicit
  1087.      caller, then next event will be processed.
  1088.      
  1089.  
  1090. Round( value, decimals )
  1091.  
  1092.      value - Numerical value that should be rounded **
  1093.      range - Number of decimal places to which value should be rounded **
  1094.      
  1095.      The first argument is rounded to the number of decimal
  1096.      places specified by the second parameter. The resulting
  1097.      number is placed in the result variable. The decimals
  1098.      argument must be an integral number in the range of 0
  1099.      to 38 inclusive.
  1100.      
  1101.  
  1102. Truncate( value )
  1103.  
  1104.      value - Numerical value that should be truncated **
  1105.  
  1106.      The decimal portion of the specified value is removed. The 
  1107.      resulting whole number is placed in the result variable.
  1108.  
  1109.  
  1110. GetRandom( range )
  1111.  
  1112.      range - Limiting range for random number generation **
  1113.      
  1114.      Fills the result variable with a pseudo-random number.
  1115.      The generated number will be between 0 and the
  1116.      specified range.  Valid ranges are from -32767 to 32767
  1117.      inclusive.  Zero of course, is not a valid range.  For
  1118.      example, a random rotational value might be generated
  1119.      by using a range of 359.  The resulting random number
  1120.      would be between 0 and 359 inclusive.
  1121.      
  1122.  
  1123. GetHitStr()
  1124.      
  1125.      Fills the result variable with the average damage done
  1126.      by this robot to all other robots in the current game.
  1127.      This is only damage done by missile hits, not
  1128.      collisions.  Missed shots do not affect this number.
  1129.      This information might be used to adjust firing
  1130.      tactics.
  1131.      
  1132.  
  1133. GetHitsOther()
  1134.      
  1135.      Fills the result variable with the number of times the
  1136.      robot has hit other robots with an energy missile.
  1137.      This number is often combined with the results of
  1138.      GetShots() to modify firing tactics.
  1139.      
  1140.  
  1141. GetShots()
  1142.      
  1143.      Fills the result variable with  the number of energy
  1144.      missiles the robot has fired.  This number does not
  1145.      reflect whether or not these shots hit something.  This
  1146.      number is often combined with the results of
  1147.      GetHitsOther() to modify firing tactics.
  1148.      
  1149.  
  1150. GetOthers()
  1151.      
  1152.      Fills the result variable with the number of other
  1153.      robots left in the current game not including the robot
  1154.      calling this function.  This number is often used to
  1155.      gauge a robot's performance.
  1156.      
  1157.  
  1158. GetTurns()
  1159.      
  1160.      Fills the result variable with the number of turns the
  1161.      robot has had in the current game.
  1162.      
  1163.  
  1164. GetHitsSelf()
  1165.      
  1166.      Fills the result variable with the number of time the
  1167.      robot has been hit by other robot's energy missiles.
  1168.      
  1169.      
  1170. Store( variable )
  1171.      
  1172.      variable  - Variable name
  1173.      
  1174.      This function allows a robot that is fighting in a
  1175.      multiple game match to pass values from one game to the
  1176.      next.  This function stores the specified variable in
  1177.      permanent storage for the current match.  When the next
  1178.      game starts, all stored variables will be automatically
  1179.      restored.  Stored variables will have the same values
  1180.      they contained the last time Store() was called in a
  1181.      previous game.  This may be useful for robots that
  1182.      "learn" during a match, changing behavior dynamically.
  1183.      This function can not be used to store variables across
  1184.      multiple matches.
  1185.      
  1186.  
  1187. Name( string )
  1188.      
  1189.      string    - Text surrounded by quotation marks
  1190.      
  1191.      Sets the robot's name.  The string will be used to
  1192.      reference the robot during game play.  If this function
  1193.      is not called anywhere in a robot's script, a name will
  1194.      be automatically assigned.
  1195.      
  1196.  
  1197. Print( string )
  1198.      
  1199.      string    - Text surrounded by quotation marks
  1200.      
  1201.      Adds the specified string to the output display in a
  1202.      robot's information window. Also, a time stamp is
  1203.      prepended to the output display. At any given point in
  1204.      a game, this time stamp will have the same value for
  1205.      all robots. The output display is limited to 200
  1206.      entries.  When Print() is called more than 200 times,
  1207.      the oldest entries will be removed first. This function
  1208.      is useful primarily when debugging a robot.  During
  1209.      game play, click on a robot's name button to display
  1210.      its information window.
  1211.      
  1212.  
  1213. Print( variable )
  1214.      
  1215.      variable  - Variable name or numeric value **
  1216.      
  1217.      Adds the specified value to the output display in a
  1218.      robot's information window. Numerical values have 7
  1219.      digits of precision, but 3 decimal places are always
  1220.      displayed for clarity. Also, a time stamp is prepended
  1221.      to the output display. At any given point in a game,
  1222.      this time stamp will have the same value for all
  1223.      robots. The output display is limited to 200 entries.
  1224.      When Print() is called more than 200 times, the oldest
  1225.      entries will be removed first. This function is useful
  1226.      primarily when debugging a robot.  During game play,
  1227.      click on a robot's name button to display its
  1228.      information window.
  1229.      
  1230.  
  1231. Stall( time )
  1232.      
  1233.      time - Amount of time to stall **
  1234.      
  1235.      Causes the robot to freeze for the specified amount of
  1236.      time.
  1237.      
  1238.      Note:  The robot will not even respond to events. This
  1239.      function completely disables a robot.
  1240.      
  1241.  
  1242. Blocking( bool )
  1243.  
  1244.      bool    - True (non-zero) or False (zero) value **
  1245.  
  1246.      This is an advanced feature. Use of the Blocking command 
  1247.      is not required to play robot battle.
  1248.  
  1249.      This function allows command blocking to be turned on or 
  1250.      off. When blocking is turned off, it remains off for the 
  1251.      entire robot script until explicitly turned back on.
  1252.  
  1253.      The default behavior is for blocking to be on. When blocking 
  1254.      is on, calls to commands that require multiple turns block. 
  1255.      This means that within a section, execution will pause on 
  1256.      the multi-turn command. Code following the multi-turn command 
  1257.      will not be executed until the multi-turn command completes. 
  1258.      In other words, all function calls are synchronous.  When 
  1259.      blocking is turned off, multi-turn commands do not block. 
  1260.      Code following the multi-turn command executes immediately. 
  1261.      In other words, all function calls are asynchronous.
  1262.  
  1263.      Blocking should be turned off with great care. A robot's 
  1264.      body, gun, and radar can perform only one multi-turn command 
  1265.      (i.e. movement) at a time. Only the last command on each body 
  1266.      part takes effect. For example, when blocking is off, if a 
  1267.      call to BodyLeft is followed immediately by a call to Ahead, 
  1268.      the original BodyLeft will be ignored while the robot moves 
  1269.      ahead. When blocking is turned off, all previously blocked 
  1270.      commands remain blocked.  Likewise, when blocking is turned 
  1271.      on, all previously unblocked commands remain unblocked. Only 
  1272.      commands that are called after a change in blocking are 
  1273.      effected by the change.
  1274.  
  1275.      Turning blocking off is used primarily with the Continue 
  1276.      command. When an event handler is called, for example, 
  1277.      movement may be stopped and continued without blocking on 
  1278.      the Continue command.  This allows the event handler to 
  1279.      be ended while restricting blocking to the section and 
  1280.      line that initiated to original movement.
  1281.  
  1282.      Note: This command is not related to and has no effect on 
  1283.      events or event registration.
  1284.      
  1285.  
  1286. WaitFor( expression )
  1287.  
  1288.      expression - Expression that evaluates to True **
  1289.                   (non-zero) or False (zero)
  1290.  
  1291.      This is an advanced feature. Use of the WaitFor() command is
  1292.      not required to play robot battle.
  1293.  
  1294.      This command provides a means of creating a user defined 
  1295.      command block. This means that within a section, execution 
  1296.      will pause on the WaitFor() command until expression becomes 
  1297.      true. Code following the WaitFor() command will not be 
  1298.      executed until expression becomes true. Generally, blocks 
  1299.      are created using expressions that change over time. Blocks 
  1300.      that are based on constant value expressions either block 
  1301.      permanently or never block.
  1302.  
  1303.      This command is generally used as a synchronization method. 
  1304.      This is particularly useful when normal command blocking 
  1305.      has been turned off with the Blocking() command. 
  1306.  
  1307.      The WaitFor() command has no effect on events. All events 
  1308.      will be handled normally. If a higher priority event occurs
  1309.      while blocking, for example, its event handler will be called. 
  1310.      When the higher priority event handler ends, control will again 
  1311.      return to the WaitFor().
  1312.  
  1313.  
  1314. Command Blocking
  1315. ----------------
  1316.     Command blocking is an advanced feature. Unless the Blocking()
  1317.     or WaitFor() functions are being used, this information should
  1318.     not be needed.
  1319.  
  1320.     Command blocking occurs when a robot function requires multiple
  1321.     turns to execute. Only commands that cause movement require 
  1322.     multiple turn to execute. These include Ahead(), Back(), 
  1323.     BodyLeft(), BodyRight(), GunLeft(), GunRight(), RadarLeft(), 
  1324.     RadarRight(), SyncAll(), SyncGun(), and Continue().
  1325.  
  1326.     When a command blocks, execution will pause on that command.  
  1327.     Code following the multi-turn command will not be executed until 
  1328.     the multi-turn command completes. In other words, the function 
  1329.     call is synchronous. Since each robot component can only perform 
  1330.     one multi-turn command at a time, blocking greatly simplifies the 
  1331.     conrol of a robot.
  1332.  
  1333.     When blocking is turned off, for example, a GunLeft(20) call 
  1334.     followed by another GunLeft(20) will only move the gun left 20 
  1335.     degrees. Since the first call does not block, the second call 
  1336.     immediately supersedes the first call. 
  1337.  
  1338.  
  1339.  
  1340. ══════════════════════════════════════════════════════════════════════════════
  1341.                                 Chapter 8.0
  1342.  
  1343.                               Special Sections
  1344. ══════════════════════════════════════════════════════════════════════════════
  1345.  
  1346. These sections are considered "special" because both of them handle events 
  1347. without being registered.  The game will automatically call these sections 
  1348. when their pre-defined events occur.
  1349.  
  1350.  
  1351. Init
  1352.      
  1353.      This section handles game startup events.  It is
  1354.      automatically called at the start of every game.  It is
  1355.      always the first section to be executed, and will only
  1356.      be called automatically once.  Most robots use this
  1357.      section to register other event handlers.  Although
  1358.      Init is only called once automatically, it may be
  1359.      called "manually" at any time by either registering
  1360.      events to it, or by using the Gosub() command.
  1361.      
  1362.      Note:  Robots are required to have an Init section.
  1363.  
  1364.  
  1365. Dead
  1366.      
  1367.      This section handles robot death events.  It is
  1368.      automatically called when a robot is killed.  Robots
  1369.      are killed either when their energy reaches zero or
  1370.      when the game they are playing in ends.  Even if a
  1371.      robot wins a game, its dead section will be called.
  1372.      Since the robot is dead, only a subset of the robot
  1373.      functions listed above have meaning.  Most robots use
  1374.      the dead section to perform some type of calculation
  1375.      then call the Store() function to save information for
  1376.      future games.  When called "manually", a dead section
  1377.      behaves like any other section.
  1378.      
  1379.      Note:  Robots are not required to have a Dead section.
  1380.      
  1381.  
  1382. ══════════════════════════════════════════════════════════════════════════════
  1383.                                 Chapter 9.0
  1384.  
  1385.                               Math Operators
  1386. ══════════════════════════════════════════════════════════════════════════════
  1387.  
  1388. Standard math operators.  Operator precedence follows that of standard 
  1389. scientific calculations.  Brackets () may be used to manually change the 
  1390. order of evaluation.  Results are also the same as those produced by a 
  1391. standard scientific calculator.
  1392.  
  1393. Description     Usage Format            Output Range
  1394. -----------     ------------            ------------
  1395. Cosine          cos( degrees )          -1 <= result <= 1
  1396. Sine            sin( degrees )          -1 <= result <= 1
  1397. Tangent         tan( degrees )          NA
  1398. ArcCosine       acos( value )*          0  <= result <= 180
  1399. ArcSine         asin( value )*          -90 <= result <= 90
  1400. ArcTangent      atan( value )           -90 <= result <= 90
  1401. Raise to power  ^                       -3.4e ± 38 <= result <= 3.4e ± 38
  1402. Multiplication  *                       -3.4e ± 38 <= result <= 3.4e ± 38
  1403. Division        /                       -3.4e ± 38 <= result <= 3.4e ± 38
  1404. Addition        +                       -3.4e ± 38 <= result <= 3.4e ± 38
  1405. Subtraction     -                       -3.4e ± 38 <= result <= 3.4e ± 38
  1406. Assignment      =                       NA
  1407. Numeric values  ± 3.4e ± 38 (6 digits)  NA
  1408.  
  1409.  
  1410. * Value must be greater than or equal to -1 and less than or equal to 1.
  1411.  
  1412. Note: Variables are automatically defined by placing them on the left side of 
  1413.       the assignment operator.  All variables have an initial value of zero 
  1414.       until explicitly assigned a different value.
  1415.  
  1416.  
  1417.  
  1418. ══════════════════════════════════════════════════════════════════════════════
  1419.                                Chapter 10.0
  1420.  
  1421.                              Logical Operators
  1422. ══════════════════════════════════════════════════════════════════════════════
  1423.  
  1424. These operators are commonly used in If() statements and custom events, but 
  1425. may be used anywhere an expression is valid.  Several operator have two 
  1426. definitions.  The second definition is provided for `C' programmers who are 
  1427. stuck in their ways (like me).
  1428.  
  1429. Description                     Usage Format
  1430. -----------                     ------------
  1431. Equality comparison                ==
  1432. Not equal to                       <>, !=
  1433. Greater than or equal to           >=
  1434. Less than or equal to              <=
  1435. Greater than                       >
  1436. Less than                          <
  1437. Logical AND                        and, &&
  1438. Logical OR                         or, ||
  1439.  
  1440.  
  1441.  
  1442. ══════════════════════════════════════════════════════════════════════════════
  1443.                                 Chapter 11.0
  1444.  
  1445.                               Robot Variables
  1446. ══════════════════════════════════════════════════════════════════════════════
  1447.  
  1448. These variables describe a robot's state during game play. They may be used 
  1449. in any expression in a robot's script.  The only restriction is that these 
  1450. variables are read only. Their values are for informational purposes only 
  1451. and are maintained by the game itself.  They may not be changed directly by 
  1452. assignment. Remember, capitalization is not important.  A variable named
  1453. "VARIABLE" will be that same as "variable" or "Variable".
  1454.  
  1455.  
  1456. Variable Summary
  1457. ----------------
  1458. accel                   The robot's current acceleration
  1459. bodyaim                 Current angle of robot's body
  1460. bodyrmn                 Angular rotation remaining in the robot's body
  1461. cldbearing              Bearing to the last object the robot collided with
  1462. cldcookie               Cookie collision indicator
  1463. cldenergy               Energy of the last object the robot collided with
  1464. cldmine                 Mine collision indicator
  1465. cldmissile              Missile collision indicator
  1466. cldrobot                Robot collision indicator
  1467. death                   Indicates that another robot has died
  1468. distrmn                 Distance remaining in the robot's lateral movement
  1469. dtcbearing              Bearing to the last object the robot detected
  1470. dtccookie               Cookie detection indicator
  1471. dtcenergy               Energy of the last object the robot detected
  1472. dtcmine                 Mine detection indicator
  1473. dtcrobot                Robot detection indicator
  1474. energy                  The robot's remaining energy level
  1475. false                   Constant zero value
  1476. gamenbr                 Current game number
  1477. games                   Number of games in the current match
  1478. gunaim                  Angle of the robot's gun
  1479. gunheat                 Heat of the robot's gun
  1480. gunrmn                  Angular rotation remaining in the robot's gun
  1481. moving                  Lateral movement indicator
  1482. off                     Constant zero value
  1483. on                      Constant non-zero value
  1484. radaraim                Angle of robot's radar
  1485. radarrmn                Angular rotation remaining in the robot's radar
  1486. rotating                Rotation indicator
  1487. scandist                Distance to the nearest detected object
  1488. true                    Constant non-zero value
  1489.  
  1490.  
  1491.  
  1492. Variable Details
  1493. ----------------
  1494. scandist
  1495.      
  1496.      Each time the Scan() function is called, this variable
  1497.      is filled with the distance to the nearest object.
  1498.      This may be the distance to a wall, another robot, a
  1499.      cookie, or a mine.  Energy missiles are ignored.  
  1500.      Distance is measured from the robot's boundary to the 
  1501.      boundary of the other object or wall. Also, if another 
  1502.      robot, cookie, or mine is detected, the appropriate 
  1503.      detection variable will be incremented and the section 
  1504.      registered to handle the event will be called.
  1505.      
  1506.  
  1507. cldrobot
  1508.      
  1509.      Set to true when the robot collides with another robot.
  1510.      When the collision occurs, the section registered by
  1511.      RegCldRobot() will also be called. Collision indicators
  1512.      are mutually exclusive. When cldrobot is true all other
  1513.      collision variables will be false. This variable is
  1514.      reset to false automatically when the robot collision
  1515.      event handle returns. If no section has been registered
  1516.      to handle robot collision events, this value will
  1517.      remain true until a collision with a different object
  1518.      occurs.
  1519.      
  1520.  
  1521. cldmissile
  1522.      
  1523.      Set to true when the robot collides with an energy
  1524.      missile.  When the collision occurs, the section
  1525.      registered by RegCldMissile() will also be called.
  1526.      Collision indicators are mutually exclusive. When
  1527.      cldmissile is true all other collision variables will
  1528.      be false. This variable is reset to false automatically
  1529.      when the missile collision event handle returns. If no
  1530.      section has been registered to handle missile collision
  1531.      events, this value will remain true until a collision
  1532.      with a different object occurs.
  1533.      
  1534.  
  1535. cldcookie
  1536.      
  1537.      Set to true when the robot collides with an energy
  1538.      cookie.  When the collision occurs, the section
  1539.      registered by RegCldCookie() will also be called.
  1540.      Collision indicators are mutually exclusive. When
  1541.      cldcookie is true all other collision variables will be
  1542.      false. This variable is reset to false automatically
  1543.      when the cookie collision event handle returns. If no
  1544.      section has been registered to handle cookie collision
  1545.      events, this value will remain true until a collision
  1546.      with a different object occurs.
  1547.      
  1548.  
  1549. cldmine
  1550.      
  1551.      Set to true when the robot collides with an energy
  1552.      mine.  When the collision occurs, the section
  1553.      registered by RegCldMine() will also be called.
  1554.      Collision indicators are mutually exclusive. When
  1555.      cldmine is true all other collision variables will be
  1556.      false. This variable is reset to false automatically
  1557.      when the mine collision event handle returns. If no
  1558.      section has been registered to handle mine collision
  1559.      events, this value will remain true until a collision
  1560.      with a different object occurs.
  1561.      
  1562.  
  1563. cldenergy
  1564.      
  1565.      When a robot collides with any other object, this
  1566.      variable is filled with the energy of that object.
  1567.      Robots may collide with energy missiles, other robots,
  1568.      cookies, and mines. All objects, including mines,
  1569.      return positive energy values. There is no such thing
  1570.      as negative energy. The value of cldenergy will not
  1571.      change until another collision occurs.  This variable
  1572.      is often used to judge an enemy robot's relative
  1573.      strength.
  1574.      
  1575.  
  1576. cldbearing
  1577.      
  1578.      When a robot collides with any other object, this
  1579.      variable is filled with the bearing to that object.
  1580.      Robots may collide with energy missiles, other robots,
  1581.      cookies, and mines. This variable is a bearing from the
  1582.      robot's current heading to that object, not an absolute
  1583.      heading.  Values are in degrees ranging from -180 to
  1584.      179.  A cldbearing of zero is always directly ahead of
  1585.      the robot.
  1586.      
  1587.      For example, if a robot were heading 135 degrees and an
  1588.      energy missile hit the robot's body at an absolute
  1589.      angle of 90 degrees (3 o-clock), the cldbearing
  1590.      variable would be set to -45.  In other words, the
  1591.      robot was hit 45 degrees left of its current heading.
  1592.      
  1593.      Remember, cldbearing says nothing about the direction
  1594.      an object was traveling when it collided with the
  1595.      robot, only where it hit the robot.  This should be
  1596.      evident since the other object may not have even been
  1597.      moving. The value of cldbearing will not change until
  1598.      another collision occurs.
  1599.      
  1600.  
  1601. dtcrobot
  1602.      
  1603.      This variable is incremented by one when another robot
  1604.      is detected by a call to Scan().  It is set to zero
  1605.      when a call to Scan() does not detect another robot.
  1606.      When robot detection occurs, the section registered by
  1607.      RegDtcRobot() will be called.  This variable is
  1608.      decremented by one automatically when the robot
  1609.      detection event handle returns.  For this reason, many
  1610.      robots call Scan() at the end of their detection event
  1611.      handlers.  If no section has been registered to handle
  1612.      robot detection events, this value will remain non-zero
  1613.      until a call to Scan() detects no other robots.
  1614.      
  1615.  
  1616. dtccookie
  1617.      
  1618.      This variable is incremented by one when an energy
  1619.      cookie is detected by a call to Scan().  It is set to
  1620.      zero when a call to Scan() does not detect a cookie.
  1621.      When an energy cookie is detected, the section
  1622.      registered by RegDtcCookie() will also be called.  This
  1623.      variable is decremented by one automatically when the
  1624.      cookie detection event handle returns.  If no section
  1625.      has been registered to handle cookie detection events,
  1626.      this value will remain non-zero until a call to Scan()
  1627.      detects no energy cookies.
  1628.      
  1629.  
  1630. dtcmine
  1631.      
  1632.      This variable is incremented by one when an energy mine
  1633.      is detected by a call to Scan().  It is set to zero
  1634.      when a call to Scan() does not detect a mine.  When an
  1635.      energy mine is detected, the section registered by
  1636.      RegDtcMine() will also be called.  This variable is
  1637.      decremented by one automatically when the mine
  1638.      detection event handle returns.  If no section has been
  1639.      registered to handle mine detection events, this value
  1640.      will remain non-zero until a call to Scan() detects no
  1641.      mines.
  1642.      
  1643.  
  1644. dtcenergy
  1645.      
  1646.      When a robot detects any other object, this variable is
  1647.      filled with the energy of that object.  Robots may
  1648.      detect other robots, cookies, and mines. All objects,
  1649.      including mines, return positive energy values.  There
  1650.      is no such thing as negative energy.  If no objects are
  1651.      detected by Scan(), dtcenergy is set to zero.  This
  1652.      variable is often used to judge an enemy robot's
  1653.      relative strength.
  1654.      
  1655.      Every time Scan() is called, dtcenergy will change. It
  1656.      will either be set to the detected object's energy or
  1657.      zero if no object was detected. This is true even when
  1658.      the detected object does not have a detection event
  1659.      handler registered.
  1660.  
  1661.  
  1662. dtcbearing
  1663.      
  1664.      When a robot detects any other object, this variable is
  1665.      filled with the bearing to that object.  Robots may
  1666.      detect other robots, cookies, and mines. This variable
  1667.      is a bearing from the robot's current heading to that
  1668.      object, not an absolute heading.  Values are in degrees
  1669.      ranging from -180 to 179.  A dtcbearing of zero is
  1670.      always directly ahead of the robot.
  1671.      
  1672.      This variable is provided primarily for consistence
  1673.      with collision variables.  Since objects may only be
  1674.      detected by a radar ping, dtcbearing always matches the
  1675.      bearing of the robot's radar at the time Scan() was
  1676.      called.  See cldbearing for more details about bearing.
  1677.      
  1678.      Every time Scan() is called, dtcbearing will change.
  1679.      It will always reflect the bearing of the robot's
  1680.      radar, even if no objects were detected.
  1681.  
  1682.  
  1683. death
  1684.      
  1685.      When another robot in the current game dies, the death
  1686.      variable is set to true. This variable is an exception
  1687.      to the read only rule.  Since the game never resets
  1688.      death to false, this must be done by the robot.  This
  1689.      variable can be used for custom events, just remember
  1690.      to change it to false at some point to end the event.
  1691.      It is easiest to think of the death variable as an
  1692.      automatically provided user variable.
  1693.      
  1694.  
  1695. energy
  1696.      
  1697.      The robot's remaining energy level.  This number always
  1698.      starts at 100 and is changed by various events during
  1699.      game play.  When this value reaches zero, the robot is
  1700.      out of the game.  This value will always match that
  1701.      shown on the game's playing field.  Please see Damage
  1702.      Summary for more detail.
  1703.      
  1704.  
  1705. accel
  1706.      
  1707.      Current setting of the robot's acceleration.  While
  1708.      moving laterally, robots are constantly accelerating.
  1709.      Therefore, this value approximately represents a
  1710.      robot's movement speed.   This value is changed by
  1711.      calling the SetAccel() function and defaults to 3.
  1712.      
  1713.  
  1714. moving
  1715.  
  1716.      True while the robot is moving laterally and false while 
  1717.      the robot is stationary or rotating only.
  1718.  
  1719.  
  1720. rotating
  1721.  
  1722.      True while any part of the robot is rotating and false 
  1723.      while the robot is stationary or moving laterally only.
  1724.  
  1725.  
  1726. gunheat
  1727.  
  1728.      Current heat of the robot's gun. Every time a robot calls 
  1729.      Fire() its gun heats up. As time passes, the gun cools down. 
  1730.      A robot may only fire another energy missile when gunheat 
  1731.      reaches zero. Most robots simply ignore this variable and 
  1732.      call Fire() as often as possible.
  1733.  
  1734.  
  1735. distrmn
  1736.  
  1737.      When a robot is moving laterally, this variable contains 
  1738.      the distance remaining until the movement is complete. This 
  1739.      information is useful when a robot needs to store or test 
  1740.      the amount of lateral movement remaining. If the robot is 
  1741.      not moving, this variable will be zero. Do not confuse this 
  1742.      variable with the internal "continue buffer" described in 
  1743.      the Stop() and Continue() functions, they are similar but 
  1744.      independent.
  1745.  
  1746. bodyrmn
  1747.  
  1748.      When a robot's body is rotating, this variable contains 
  1749.      the amount of rotation remaining until the rotation is 
  1750.      complete. This information is useful when a robot needs 
  1751.      to store or test the amount of body rotation currently 
  1752.      remaining. If the robot's body is not rotating, this variable 
  1753.      will be zero. Do not confuse this variable with the internal 
  1754.      "continue buffer" described in the Stop() and Continue() 
  1755.      functions, they are similar but independent.
  1756.  
  1757. gunrmn
  1758.  
  1759.      When a robot's gun is rotating, this variable contains 
  1760.      the amount of rotation remaining until the rotation is 
  1761.      complete. This information is useful when a robot needs 
  1762.      to store or test the amount of gun rotation currently 
  1763.      remaining. If the robot's gun is not rotating, this variable 
  1764.      will be zero. Do not confuse this variable with the internal 
  1765.      "continue buffer" described in the Stop() and Continue() 
  1766.      functions, they are similar but independent.
  1767.  
  1768. radarrmn
  1769.  
  1770.      When a robot's radar is rotating, this variable contains 
  1771.      the amount of rotation remaining until the rotation is 
  1772.      complete. This information is useful when a robot needs 
  1773.      to store or test the amount of radar rotation currently 
  1774.      remaining. If the robot's radar is not rotating, this variable 
  1775.      will be zero. Do not confuse this variable with the internal 
  1776.      "continue buffer" described in the Stop() and Continue() 
  1777.      functions, they are similar but independent.
  1778.  
  1779. bodyaim
  1780.      
  1781.      Current angle of the robot's body.  Values are in
  1782.      degrees ranging from 0 - 359.  A bodyaim of zero is
  1783.      towards the top of the arena, or map north.  This value
  1784.      is changed by the various rotation functions.
  1785.      
  1786.  
  1787. radaraim
  1788.      
  1789.      Current angle of the robot's radar.  Values are in
  1790.      degrees ranging from 0 - 359.  A radaraim of zero is
  1791.      towards the top of the arena, or map north.  This value
  1792.      is changed by the various rotation functions.
  1793.      
  1794.  
  1795. gunaim
  1796.      
  1797.      Current angle of the robot's gun.  Values are in
  1798.      degrees ranging from 0 - 359.  A gunaim of zero is
  1799.      towards the top of the arena, or map north.  This value
  1800.      is changed by the various rotation functions.
  1801.      
  1802.  
  1803. result
  1804.      
  1805.      This is a generic results buffer.  Since robot
  1806.      functions do not return values, any function that
  1807.      generates a number fills this variable with its
  1808.      results.  This value may therefore change often.  It
  1809.      should only be used immediately after calling a
  1810.      function that fills it.  If the value is needed at a
  1811.      later time, it should be assigned to a user defined
  1812.      variable.  All functions that use this variable mention
  1813.      it in their description (usually a GetSomething()
  1814.      function).
  1815.      
  1816.  
  1817. gamenbr
  1818.  
  1819.      Current game number. Robot Battle matches have from 1 to 
  1820.      65,500 games. This variable is set to 1 for the first 
  1821.      game of a match and incremented by one for each successive  
  1822.      game. The gamenbr variable will be 2 for the second game 
  1823.      of a match, 3 for the third, and so on.
  1824.  
  1825.  
  1826. games
  1827.  
  1828.      Number of games in the current match. This variable does 
  1829.      not change from game to game, only from match to match. 
  1830.      It always contains the total number of planned games in 
  1831.      a match. Robot Battle matches have from 1 to 65,500 games.
  1832.  
  1833.  
  1834. on
  1835.      
  1836.      Evaluates to a non-zero value.
  1837.  
  1838.  
  1839. true
  1840.      
  1841.      Evaluates to a non-zero value.
  1842.      
  1843.  
  1844. off
  1845.      
  1846.      Evaluates to a zero value.
  1847.  
  1848.  
  1849. false
  1850.      
  1851.      Evaluates to a zero value.
  1852.      
  1853.  
  1854. ══════════════════════════════════════════════════════════════════════════════
  1855.                                 Chapter 12.0
  1856.  
  1857.                            User Defined Variables
  1858. ══════════════════════════════════════════════════════════════════════════════
  1859.  
  1860. User defined variables are the primary means of storing information about a 
  1861. robot. As the designer of a robot, you decide how many user variables you 
  1862. need and what their names should be. All variables are global. Global means 
  1863. that a variable can be accessed and changed from anywhere in a script file.
  1864.  
  1865. User variables must start with a letter (A-Z) or an underscore (_). Variables 
  1866. may contain numbers (1-9), but they may not start with a number. Any name may 
  1867. be used for variables except section names. In other words, round is a valid 
  1868. variable name, but init is not.
  1869.                                
  1870.  
  1871. User variables are automatically defined by placing them on the left side of 
  1872. the assignment operator. This may be done anywhere in a robot's script. At 
  1873. the start of a game, user defined variables are initialized to zero. The only
  1874. exception to this rule are variables stored with a previous call to the 
  1875. Store() function. The following line defines a user variable called fire_engy:
  1876.  
  1877.      fire_engy = 1
  1878.  
  1879. Assuming Store() has not been called for fire_engy in a previous game, the 
  1880. variable fire_engy is created and assigned a value of zero at the start of a 
  1881. game. Not until the line above is actually executed will the variable contain 
  1882. a value of one. If this line is never reached during a game, fire_engy will 
  1883. always contain a value of zero.
  1884.  
  1885. Variables that where stored in a previous game with the Store() function do 
  1886. not default to values of zero. When these variables are created at the start 
  1887. of a game, they are assigned the values they contained when Store() was last 
  1888. called for each variable. This allows variables to be passed from one game to 
  1889. the next in a match.
  1890.  
  1891. Variables may contain values in the range of ± 3.4e ± 38 with a precision of 
  1892. 6 digits. As with most computer languages, floating point (real number) math 
  1893. is not perfectly accurate. Testing for equality after performing calculations 
  1894. may produce unexpected results. For example, acos( cos(20) )  may yield 
  1895. 19.9999 instead of 20. Use the Round() function if this problem arises.
  1896.  
  1897.  
  1898. Example:
  1899. --------
  1900.  
  1901.      test1 = variable
  1902.      variable = -10.5
  1903.      test2 = variable
  1904.      print( test1 )
  1905.      print( test2 )
  1906.  
  1907. Assuming Store() has not been called, what are the values of test1 and test2? 
  1908. When the game starts, test1, variable, and test2 are all created and assigned 
  1909. values of zero. Line 1 therefore assigns test1 to a value of zero (which it 
  1910. already was).  Line 2 changes variable from a value of 0 to a value of -10.5.  
  1911. Line 3 then changes test2 from a value of 0 to a value of -10.5.
  1912.  
  1913. Thus, the Print() functions display:
  1914.      0
  1915.     -10.5
  1916.  
  1917.  
  1918. ══════════════════════════════════════════════════════════════════════════════
  1919.                                 Chapter 13.0
  1920.  
  1921.                                Damage Summary
  1922. ══════════════════════════════════════════════════════════════════════════════
  1923.  
  1924. The following summarizes the events that can change a robot's energy store.  
  1925. When a robot collides with any other object, it loses 1 energy point.  The 
  1926. "obtained from" description below is provided to illustrate this. All objects 
  1927. contain positive energy. There is no such thing as negative energy. The 
  1928. difference between objects is whether they add or subtract their energy from 
  1929. a robot.
  1930.  
  1931.  
  1932. Action                          Energy Change
  1933. ------                          -------------
  1934. Firing energy missile           -1 to -7
  1935. Collision with energy missile   -5 to -29  obtained from: (-4 to -28 -1)
  1936. Collision with another robot    -1         obtained from: (-1)
  1937. Collision with energy mine      -20        obtained from: (-19 - 1)
  1938. Collision with energy cookie    +20        obtained from: (21 - 1)
  1939.  
  1940.  
  1941.  
  1942. ══════════════════════════════════════════════════════════════════════════════
  1943.                                 Chapter 14.0
  1944.  
  1945.                              Points Calculation
  1946. ══════════════════════════════════════════════════════════════════════════════
  1947.  
  1948. Points calculation is straight forward.  When a robot is eliminated from a 
  1949. game, all surviving robots receive a single point.  The winner of a game also 
  1950. receives one bonus point for winning.  In a six player game, for example, the
  1951. winner receives 6 points, second place receives 4, third gets 3, fourth gets 
  1952. 2, fifth gets 1, and the loser gets nothing.  Points are displayed at the end 
  1953. of each match.  In a multiple game match, points from all games in the match
  1954. are tallied for the final standings.
  1955.  
  1956.  
  1957.  
  1958. ══════════════════════════════════════════════════════════════════════════════
  1959.                                 Chapter 15.0
  1960.  
  1961.                             Tips and Techniques
  1962. ══════════════════════════════════════════════════════════════════════════════
  1963.  
  1964. - Organize robots into small sections (subroutines) the perform specific 
  1965.     tasks.  These section enhance robot clarity, are often reusable within a 
  1966.     single robot, and make great cut and paste candidates for new robots.
  1967.   
  1968. - Check out the sample robots (fire.prg in particular) for some useful 
  1969.     subroutines that can be copied immediately.
  1970.   
  1971. - Use the Print() statements to help debugging.  It can display both 
  1972.     strings surrounded by quotations and expressions.
  1973.  
  1974. - Write special purpose debugging robots to help figure out how normal 
  1975.     robots will behave.  Debugging robots behave in a predictable manner 
  1976.     (such as driving to the center of the arena) helping to isolate a 
  1977.     particular feature or problem in another robot.
  1978.   
  1979. - When using a debugging robot, use the Stall() function in the normal robot. 
  1980.     This will give the debugging robot time to start it predetermined 
  1981.     activities.
  1982.   
  1983. - Use comments liberally in robot scripts.  Comments act as helpful reminders 
  1984.     when examining robot scripts. Any text after a # or a // is considered a 
  1985.     comment. Comments are completely ignored by Robot Battle.
  1986.   
  1987. - Use indentation with If() statements.  Indenting lines between If(), 
  1988.     Elseif(), Else, and Endif statements greatly increases a robot script's 
  1989.     readability.
  1990.   
  1991. - Be careful when using variables that are changed often during game play. 
  1992.     These include result, cldbearing, cldenergy, dtcbearing, and dtcenergy. 
  1993.     If needed at any time other than immediately after they are filled, 
  1994.     assign their values to user defined variables.
  1995.   
  1996. - The arena measures 400 unit in each direction, robots measure 33 units in 
  1997.     each direction, cookies and mines have diameters of 9 units, and energy 
  1998.     missiles are 3 units square.
  1999.   
  2000. - As with most computer languages, floating point (real number) math is not 
  2001.     perfectly accurate. Particularly after trigonometric functions, testing 
  2002.     for equality without calling Round() will not always work.  For example, 
  2003.     acos( cos(20) ) may yield 19.9999 instead of 20.
  2004.   
  2005. - The amount of time it takes for a game with no activity to be automatically 
  2006.     ended may be changed. The default value is 10,000 turns.  To make this 
  2007.     value smaller or larger, open the winrob.ini file in an ASCII text editor.  
  2008.     Change the value of the entry under [WinRob] called auto_end_turns. If 
  2009.     auto_end_turns does not exist, add it under [WinRob] with the desired 
  2010.     time-out value.
  2011.  
  2012. - Large robots that respond to many events can become quite complicated. 
  2013.     Complexities often arise from the need to remember where a robot is and 
  2014.     what it is doing before and after each event. Designing robots as state 
  2015.     machines can simplify this problem. A robot's behavior can be modeled as 
  2016.     transitions from one state to the next, allowing easy state recovery 
  2017.     during and after an event.
  2018.