The easiest way would be to do multiple passes. You render the scene once for each light and have it add the colors together each pass. This results in some overhead from rendering everything multiple times, but this can be reduced with a z-prepass or by using deferred rendering.
Yes, I suppose that could be quite slow for large numbers of lights, but if it only happens in extreme cases then it could work. This is probably a dumb question, but can you do the multiple passes using a simple additive blend function? Or something more complicated.
The only problem with this is that for game-play reasons I need to be able to use translucency. (This is for showing partially transparent character sprites when they are hidden behind the environment. Think infinity engine style.) I'm not sure if that can work, I need to think about it.
Your description made me very curious, - would you mind showing your lighting off a bit with demo screenshots?
Yes I can do, it's really nothing special and I have only stock art to test it with. I've generalised the spotlight formula a bit to use 3 attenuation factors in the normal way, and a range falloff on top of that so that the range can be know precisely. The two circles are debug drawings of the light position in my game editor.
Putting the data in a texture is interesting, I hadn't considered that. As I said I don't have much intuition for the performance costs of various things in opengl, so I don't know how this would compare with using a large number of uniforms. For example, how important is it to minimise the setting of uniforms in shaders? And how does it vary by the amount of data? (i.e is setting an array of 10 vec4 much worse than simply setting 3 ints or similar.)