Okay, here's another new-and-improved version; it integrates better with the existing systems. Also, for the record, you don't actually need more than 4 texture *units*, you just need more than 4 texture addressable *coordinates.* The major problem I was running into earlier, as it turned out, was that the code in r_program.c was refusing to give me the texture references I was asking for because it was capping them at the 4 units that my card has. The code now checks both GL_MAX_TEXTURE_UNITS and GL_MAX_TEXTURE_COORDS, and uses the latter when deciding whether functions like R_SelectTexture succeed or not.
It would also be easy to get rid of the changing seasons, which would require fewer texture units, less memory, and so forth. It seemed like a nifty feature, but it may not be worth the resources required. It would also be fairly easy to do the rendering of the city lights as a separate pass, which would mean another texture address that wouldn't be required, but it seemed better to do it all in one pass. Besides, I had just learned GLSL, so I wanted to flex its muscles a little
In terms of the light textures, the light is actually off-white at the moment (slightly yellow looks more correct). It would be easy enough to simply use a grayscale image, which would certainly mean a smaller file on disk, but I don't think it would help much in terms of graphics card memory (someone correct me if I'm wrong).