It's almost like the engine won't allow them to attack unless they're at a certain range from the player.
The engine will take the range in action. If you want an enemy to use a projectile from long range, you need to set the right range.
Make the long range move to have a bigger RANGE than the close attack and the enemy will use it,
So if you have a attack2 with range 0-40 and a freespecial2 with range 0-100 and you are 80px from the target, the enemy will try to use freespecial2 instead. When you are in the range of both attacks, the enemy will use more attack than freepspecial,
And it you have freespecial1 and freepsecial3, both with same range, the engine will use the smaller number (freespecial1) more often. Works for attacks too.
Read the maual about range:
range {min} {max}
~Used for AI controlled entities' attacks and jump. Usually used by enemy, NPC and homing projectile.
~This command lets the entities know when to perform their attacks or to jump on platforms.
~For the entity to use the attack, its opponent must be more than {min} away, but less than {max} away in x axis.
~Entity's opponent is determined by 'hostile' setting (see Header Data above).
~For the enemy to jump on a platform, the enemy must be within {min} pixels of the platform, and the platform must be less than {max} pixels high.
~This is measured in pixels, starting at the entity's offset point and moving towards the opponent's offset.
~If not included, the first number will default to -10, and the second to 20 times the entity's jumpheight variable.
~For homing projectiles, this determines their targeting range.
~If this command is declared together with 'rangez' and/or 'rangea', opponent's location must be within ALL of them before attack animation is performed.
~Default 'range' for A