diff --git a/README.md b/README.md index 7f773548..85c6a717 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# newserv +# newserv newserv is a game server, proxy, and reverse-engineering tool for Phantasy Star Online (PSO). @@ -9,6 +9,7 @@ Feel free to submit GitHub issues if you find bugs or have feature requests. I'd See TODO.md for a list of known issues and future work I've curated, or go to the GitHub issue tracker for issues and requests submitted by the community. **Table of contents** +* [History](#history) * [Compatibility](#compatibility) * Setup * [Server setup](#server-setup) @@ -24,6 +25,24 @@ See TODO.md for a list of known issues and future work I've curated, or go to th * [Chat commands](#chat-commands) * [Non-server features](#non-server-features) +# History + +The history of this project essentially mirrors my development as a software engineer from the beginning of my hobby until now. If you don't care about the story, skip to the "Compatibility" or "Setup" sections below. + +I originally purchased PSO GC when I heard about PSUL, and wanted to play around with running homebrew on my GameCube. This pathway eventually led to [GCARS-CS](https://github.com/fuzziqersoftware/gcars-cs), but that's another story. + + After playing PSO for a while, both offline and online, I wrote a proxy called Khyps sometime in 2003. This was back in the days of the official Sega servers, where vulnerabilities weren't addressed in a timely manner or at all. It was common for malicious players using their own proxies or Action Replay codes (a story for another time) to send invalid commands that the servers would blindly forward, and cause the receiving clients to crash. These crashes were more than simply inconvenient; they could also corrupt your save data, destroying the hours of work you may have put into hunting items and leveling up your character. + +For a while it was essentially necessary to use a proxy to go online at all, so the proxy could block these invalid commands. Khyps was designed primarily with this function in mind, though it also implemented some convenient cheats, like the ability to give yourself or other players infinite HP and allow you to teleport to different places without using an in-game teleporter. + + After Khyps I took on the larger challenge of writing a server, which resulted in Khyller sometime in 2005. This was the first server of any type I had ever written. This project eventually evolved into a full-featured environment supporting all versions of the game that I had access to - at the time, PC, GC, and BB. (However, I suspect from reading the ancient source files that Khyller's BB support was very buggy.) As Khyller evolved, the code became increasingly cumbersome, littered with debugging filth that I never cleaned up and odd coding patterns I had picked up over the years. My understanding of the C++ language was woefully incomplete as well (as opposed to now, when it is still incomplete but not woefully so), which resulted in Khyller being essentially a C project that had a couple of classes in it. + + Sometime in 2006 or 2007, I abandoned Khyller and rebuilt the entire thing from scratch, resulting in Aeon. Aeon was substantially cleaner in code than Khyller but still fairly hard to work with, and it lacked a few of the more arcane features I had originally written (for example, the ability to convert any quest into a download quest). In addition, the code still had some stability problems... it turns out that Aeon's concurrency primitives were simply incorrect. I had derived the concept of a mutex myself, before taking any real computer engineering classes, but had implemented it incorrectly. I made the race window as small as possible, but Aeon would still randomly crash after running seemingly fine for a few days. + +At the time of its inception, Aeon was also called newserv, and you may find some beta releases floating around the Internet with filenames like `newserv-b3.zip`. I had released betas 1, 2, and 3 before I released the entire source of beta 5 and stopped working on the project when I went to college. This was around the time when I switched from writing software primarily on Windows to primarily on macOS and Linux, so Aeon beta 5 was the last server I wrote that specifically targeted Windows. (newserv, which you're looking at now, is a bit tedious to compile on Windows but does work.) + + After a long hiatus from PSO and much professional and personal development in my technical abilities, I was reminiscing sometime in October 2018 by reading my old code archives. Somehow inspired when I came across Aeon, I spent a weekend and a couple more evenings rewriting the entire project again, cleaning up ancient patterns I had used eleven years ago, replacing entire modules with simple STL containers, and eliminating even more support files in favor of configuration autodetection. The code is now suitably modern and stable, and I'm not embarrassed by its existence, as I am by Aeon beta 5's source code and my archive of Khyller (which, thankfully, no one else ever saw). + # Compatibility newserv supports several versions of PSO, including various development prototypes. Specifically: diff --git a/static/s-aeon.png b/static/s-aeon.png new file mode 100644 index 00000000..6a912852 Binary files /dev/null and b/static/s-aeon.png differ diff --git a/static/s-khyller.png b/static/s-khyller.png new file mode 100644 index 00000000..cd78b867 Binary files /dev/null and b/static/s-khyller.png differ diff --git a/static/s-khyps.png b/static/s-khyps.png new file mode 100644 index 00000000..34fc6f2f Binary files /dev/null and b/static/s-khyps.png differ diff --git a/s-newserv.png b/static/s-newserv.png similarity index 100% rename from s-newserv.png rename to static/s-newserv.png