Skip to navigation

BBC Micro Elite

In the crosshairs

How the game knows whether an enemy is being hit by our laser fire

References: HITCH
  During combat, one of the most important calculations is working out whether
  we have another ship in our sights. We need to calculate this when we're
  trying to hit another ship with our lasers, and when we're trying to get the
  enemy in our sights so we can lock a missile onto the target. In both cases,
  we use the HITCH routine to work out just how close to the crosshairs that
  ship really is. Let's take a look at how the HITCH routine works.
  
  There are a number of steps we have to take to work out whether a ship is in
  our crosshairs. They are as follows.
  
    * Make sure the ship is in front of us (z_sign is positive)
  
    * Make sure this isn't the planet or sun (bit 7 of the ship type is clear)
  
    * Make sure the ship isn't exploding (bit 5 of byte #31 is clear)
  
    * Make sure the ship is close enough to be targeted or hit (both x_hi and
      y_hi are 0)
  
    * Test whether our crosshairs are within the targetable area for this ship
  
  This last one needs further explanation. Each ship type has, as part of its
  blueprint, a 16-bits value that defines the area of the ship that can be
  locked onto by a missile or hit by laser fire. The bigger this value, the
  easier the ship is to hit.
  
  The key to the calculation is the observation that the ship's x- and
  y-coordinates give the horizontal and vertical distances between our line of
  fire and the ship. This is because the z-axis points out of the nose of our
  ship, and is therefore the same as our line of fire, so the other two axes
  give the deviation of the other ship's position from this line.
  
  We've already confirmed in the checks above that x_hi and y_hi are both zero,
  so we calculate this:
  
    (S R) = x_lo^2 + y_lo^2
  
  which, using Pythagoras, is the same as the square of the distance from our
  crosshairs to the ship.
  
  If this calculation doesn't fit into the 16 bits of (S R) then we know we
  can't be aiming at the ship, but if it does, we compare (S R) with the 16-bit
  targetable area from the ship's blueprint, and if (S R) is less than the
  targetable area, the ship is determined to be in our crosshairs and can
  be hit or targeted.
  
  So the targetable area is the square of the distance that the ship can be from
  the centre of our crosshairs but still be locked onto by our missiles or hit
  by our lasers.