Thanks for the help, your code showed me that my problem is with al_load_bitmap.
al_load_bitmap("c:\noise.png") and al_load_bitmap("noise.png") both return zero, and i've got a copy of the .png in both the .exe folder and in the root of my c drive. I've attached the updated code. Maybe it works in Linux!
The program uses 9.8 m/s^2 to simulate gravity, and uses a formula for parasitic drag forces to slow down the projectile. I'm using a separate camera to handle the gun, but the same camera as the terrain to handle the projectiles, as I just accidentally figured out how to rotate points using a pre-computed matrix, and that's what I use to make the projectile start where the muzzle is, instead of the middle of the screen. I just gotta use that matrix to make the pistol use the same camera as the terrain and icosahedron-bullets.
This explanation should help anyone who doesn't get vertex rotation using matrices:
generate a unit vector starting from your eye, going directly to your right. now make another going straight up, and another straight ahead. multiply your vertex's x coordinate by the components of the right vector, the y by the components of the up vector, and the z by the components of the forward vector. add all three vectors, and you've rotated your point.
I'm glad I finally figured that out, I'd given up hope of understanding how matrix multiplication could rotate a set of points.
edit: the parasitic drag was making the bullets follow a weird bendy trajectory, fixed!