There's a phrase "paying your software taxes" which refers to coding your application to be more robust in circumstances such as running in a non-EN-US environment, on a terminal server, or various other things. Basically I interpret it as doing all the messy things you'd rather not do but have to in order to get a functionally complete application.
Paying your Quake taxes is related: this involves ensuring that your modified engine will stand the best chance of being able to successfully run all the weird and wonderful things that have been made over a > 13 year period.
The name of the game here is that sometimes you have to ditch an elegant architecture in order to properly support something, sometimes you have to forgo tighter validation, sometimes you have to put in a cheap and nasty hack, sometimes you have to deliberately and knowingly do something the wrong way, and sometimes you have to abandon a nice effect, or a significant performance boost, because all of these things can play havoc with popular mods.
There are 3 main categories I assign these to:
- Won't fix. The code change you're putting in is so important that you're prepared to accept loss of some mod compatibility. This is generally reserved for something that otherwise causes a crash bug in another more popular (or sometimes more recent) mod, or that just can't be fixed correctly. Right now I've assigned implementing a correct solution to the problem of Fullbright Colours to this one.
- Nice to fix. You have a mod that does various things, and you can get a basic code infrastructure up to send or receive the data expected by the mod, but going any further (such as actually implementing it) is low priority. For example, DirectQ can now run Nehahra; it sure doesn't actually implement everything in Nehahra, at times it's just got a function that soaks up the data or message and does absolutely nothing with it. Some day I'm going to complete it, but not right now. Right now just enough has been done to ensure - as much as I can - that running Nehahra won't crash the engine.
- Must fix. These are the ones that are generally caused by something that was legal but A BAD IDEA in - more often than not - GLQuake (rather than WinQuake) but that now cause crash bugs or serious glitches in your engine. They may also be resulting from something that was developed in a mod or engine before things were understood to the degree they are today, and which must be supported. They can also be ugly QC hacks that just happened to work because of a bug elsewhere in the ID engines. Generally if they don't crash they get relegated one or two levels down unless the end result is otherwise sufficiently serious.
It transpires that in Ye Olde Dayes of Enginye Developmente, a lot of engines sent a U_TRANS bit from the server to the client but did not bump the value of PROTOCOL_VERSION in order to notify the client that "the data I'm sending you is different to what you might normally expect". Nehahra did this, and I guess other engines followed that lead (I may have even been guilty myself back then).
Normally this is harmless enough in single player; in multiplayer so long as everyone is on the same engine it's also harmless; likewise if the server is not one of those engines it will be harmless - the bit just never gets sent so the unexpected data never arrives. I was bitten by it in a demo which was recorded on one of these engines - DirectQ did client-side validation of the protocol before it would accept the data following a U_TRANS bit. There was no absolute need for this as the server controls the protocol and we're not actually changing the size or format of any data here - it just felt like the right thing to do, but it turned out to be wrong.
I feel that it's still the Right Thing (capitals) but also the wrong thing (lowercase), which is a funny end result here, but unfortunately it had to go.
I guess the moral of this story is that the Quake engine is not a pristine lab environment, and that there's no point in having an elegant - or even Correct (capital C) - architecture even for small stuff like this, cos it ain't worth a spit if it can't handle some of what can get thrown at it in the Real World.