Most people see source code as comparable to blueprints. But in actual fact, source code is more like *parts*. When you open that box of IKEA furniture, the individual pieces of wood and screws? That's actually the source code. The instruction booklet itself would in software terms be the make files and the compile instructions and the configuration file templates to make the software work, not all of which are always stored within the source repositories. Those things are critical. Without them, all you have is a pile of wood.
I don't know how to say this tactfully, and I don't intend this in the spirit in which it will probably be taken, but have you ever actually done development? Because what you're describing simply isn't true.
What you are calling *parts* is akin to what I would call individual source code files. If all NCsoft had were a bunch of *.c and *.h files, I might agree with you. But in any modern development system, those files are bound together in a project file; in the case of City of Heroes, those would be Visual Studio project and solution files. Those files are most definitely akin to blueprints; they contain all of the references and relationships of how the files fit together to build a project. Now granted, they are probably old VS project/solution files, like 2008 or 2010, but the software really isn't that hard to come by to put it all back together again.
And I also understand a great deal about how databases work, too. Yes, it would most certainly be helpful to have a functional system up and running to do things like pull the schema so that you don't have to recreate it from scratch from the source code, but it's not
that hard to recreate a schema from the source code. For example, if you see something in the code like:
char *sql = sprintf("SELECT acct_id, acct_name, acct_valid FROM accounts WHERE acct_id = %d;", acct_id);
Then you know that there's a table or view named accounts that contains columns acct_id, acct_name, and acct_valid. You also know that acct_id is almost certainly a numeric column since the select statement refers to it as an integer, and it's a pretty good bet that acct_name is a text column just because of its name.
I'll grant you that this is a very simple example, that real-world examples are much more complicated, but my point is that on a scale of one to ten, I'd only put reverse engineering a database from source code at a difficulty of five or so. It's not so much hard as it is tedious, and believe me, there are people who are plenty enough motivated to undertake such a task to put it well within the realm of the feasible.
Probably the hardest part of reverse engineering the code to get it running is if they hard-coded things based on specific hardware they're running. For example, if they wrote in short assembly routines that used CPU features specific to an AMD processor or something crazy like that, it might be kind of tough to port that to an Intel processor, but given that I've been told by several devs that the "physical" servers were actually VMs, I can't imagine that there is code at
that low a level.
Look, I'm not trying to imply that it would be easy, I know that there are probably hundreds of source files that would have to be pored over. And having been a C++ developer in a past life, I know firsthand how much a pain in the ass it is picking up someone else's spaghetti code and trying to make sense of it when that person is gone and inaccessible. (At one point, I was on a team that developed a space planning solution that interfaced with AutoCAD, and when the former developer got a new job in another city, he picked up and left and we never heard from him again. My boss came to me and said, "Um... Tony, we need you to take over and finish this project. Good luck!")
It happens every day, and people deal with the challenges. Look at any of the innumerable open source projects that are abandoned or forked successfully if you want proof. Or hell, just look at how well known and picked apart the client is with exactly zero information from the developers and zero lines of source code. And you think that the server code and configuration would be indecipherable to a competent developer/hacker
with the source code?
To be blunt, every developer likes to think that he or she is indispensable, that without him or her, the project would simply fall apart. Every developer also believes that every code base that he or she didn't personally develop from scratch is just an incomprehensible mess that no one else but him or her could figure out. I don't think it's disingenuousness on their part, it's just human nature. That's why when Positron would make comments kind of like what you're making here, my private response was always, I get what you're saying, and I know it would be difficult. But impossible? C'mon, man. I don't doubt his (or your) knowledge or ingenuity, but I do think that he (and you) underestimate the capabilities of a competent developer.