Lantyz, good question

You're completely right, everything is possible, and the only problem is how long it all takes, i.e. what is feasible. To understand what's feasible it helps to understand how I work...
Most of what I do is finding code. GTA2 has some ridiculous number of lines of code in assembly, so there is no way that I can go through and map the structure of it completely because it would take forever. So what I do is try to find a point of reference. As an example, to fix the 100 MMP limit, I figured GTA2 would be using a Windows API search function on the data directory to find *.mmp files. So what did I find? References to FindFirstFile, FindNextFile, and the string "*.mmp". That allowed me to find the code quickly. That was an easy finding fix, but a hard code-wise fix, because I had to basically rewrite the map parsing loop to use a dynamicly allocated array instead of the original (static) array. Another example is the UDP -> TCP fix- easy, because all I had to do was find all the DirectPlay send calls, and change one parameter of them.
So, easy fixes are normally things where I can find a nice reference point. API/DirectX functions names that I can guess, strings embedded in the EXE or read into memory, debug displaying text (because of its strings), things like that that directly point to the relevant code are easy.
Hard things are normally where I can't find the relevant code. A good example is most changes to the script compiler. They are mostly changes to GTA2's internal data structures which I have no reference points into; carried out by interpreting a bytecode no one understands; at who knows when in the game cycle. I can definitely find the code (in fact already have) that reads in the compiled script files into memory, from the API calls, but I have very little chance of finding the relevant code that executes them without first totally mapping out the compiler and bytecode reading parts of GTA2

Sometimes though hard things are when I can find part of the code but the overall structure is too complex for me to discern without spending huge amounts of time on it. An example of this is the chat special characters code. I found the code easily from the DirectX receive chat message call and the interpretation of the DirectX key constants. But what it does with the keys you press is really weird and even comparing between 9.6 and 10.3 I couldn't figure out what the hell was going on. I did try copying some of the code over but didn't get it all so it just crashed.
Add to all this the fact that I'm forever distracted by a million things wanting my time and that I'm currently trying to help Sektor fix the ports issue and you get the idea.
Hope that helps ;-D