The story so far

I tried EverQuest Online Adventures soon after it came out in Europe, probably late 2003. It seemed to me that the European server wasn't hugely populated at least that time. I first made an elf character. In the first hours I saw only two other players in Tethelin. I decided to try barbarian next and for some reason the starting area was more crowded and I stuck with that. I never made it to the maximum level, 50 at the time (Frontiers was never released in Europe).

Even with its problems the game has held a special place for me. The world seemed big and unknown - there was no online map. There's a certain magical feel about it. No doubt the nostalgy has been boosted by the fact that nobody can play it anymore and you only have the memories. Along the years I've occasionally browsed YouTube, listening to EQOA music and watching gameplay videos.

The beginnings

As we know, Sony shut down the servers in 2012. The idea that EQOA could be played again has been around but for some reason it wasn't until this corona winter (2020-2021) when I started looking at the possibility seriously.

I found my original game disc, installed the PCSX2 emulator, and tried what happens. Turned out the first obstacle was the DNAS check. DNAS was Sony's system for checking the user had permission to play online games. Sony shut down the service years ago, so online gaming on PS2 is currently impossible without some kind of workaround. I googled and found a patch file supposedly bypassing the DNAS check but it was for the US version and just changing the game ID didn't make it work on my PAL version. So I started figuring out what PCSX2 patch files are and how to modify them.

DNAS patches

Eventually I got the DNAS bypass working. The game would now try to connect to a patch server. I started looking for server software that would perhaps let me start the actual game.

EQOA Revival patch and login servers

I found the EQOA Revival Wiki. There were small Python scripts there that did the job of the patch and login servers. Some modifications were required to make them work with my PAL version, but now I got to the stage where the PS2 client would attempt to contact actual game servers with UDP packets.

This is where the progress seemed to end. The wiki had "EQOAemu_2015", a simple UDP server written in C, but due to protocol incompatibilities with the PAL version I couldn't get to server selection. I also found unenergizer's OpenEQOA on Github, but it didn't seem to do UDP traffic at least at that point.

Starting my own server project

So apparently there wasn't any publicly available server that would let you to enter the game world. Afterwards I found the wiki has the Windows-based Hagley test server that supports one client. There had apparently also been at least two private multiplayer servers in development for years but these, or their source code, weren't available at the time. The existing servers would require pre-built PCSX2 savestates and/or memory cards containing the custom server's IP address.

I started figuring out the UDP packet structure and after five days of tweaking the EQOAemu_2015 server I finally got to the server selection screen. At this point, December 2020, I joined the EQOA Revival Discord (which I think had around 150 members at the time), telling about my patches for the PAL version, about what I had learned about the game's networking protocol, and how it was possible to use the patch server to let clients connect without a pre-built memory card. I asked for suggestions about how to progress further.

A couple of days later I got the server selection working and reached the character selection for the first time. I had to modify the EQOAemu_2015's character list packet too, as the existing version crashed the PAL client. Selecting a character would just bring a "connection problem detected" notice and the game didn't start.

As EQOAemu_2015 seemed mostly a proof of concept test rather than a working server and there weren't any other options near a functioning state, I started my own server project from scratch around December 13. I made it in Java because that seemed the best option for me to be able manage a rather large project while developing it reasonably quickly.

Entering the game world

I worked with some packet captures available on the EQOA Revival Wiki to figure out the mostly undocumented UDP packet structure. I also got some advice on the Discord tech channel. On December 17 I got to the stage where the game world loads and I can move around (slowly). There weren't character models visible and the connection failed within a minute or two. My first EQOA video documenting the progress, December 19: Everquest Online Adventures PS2 vanilla/PAL test server

Next steps: visible controllable character and fixed movement speed on December 23. In the next days I figured out more about the protocol that displays players and NPC's and made a preliminary system for moving NPC's around. EQOA test server, experimenting with creature models (original upload December 25).

First two player test

On December 28 I did the first 2-player test, using two PCSX2's with the same controller, EQOA server: two player test . The next day I figured out the PAL version of the character creation protocol.

Password encryption

Next I spent probably a couple of days figuring out the password hashing (actually encryption) method the PS2 client uses in the account creation and login phase. Without the ability to check passwords, creating a proper server wouldn't be possible.

I had the idea that creating even a simple open server ASAP, allowing anyone to try out entering the game world, would be cool and could generate momentum and bring in more developers and creators to the project (it now seems that it did, but time will tell where this leads).

Later it turned out other developers had also figured out the password algorithm previously, but this was another thing that wasn't documented or published anywhere.

Apparently a different encryption method is used in certain UDP packets - for this, I got a piece of code from Bwiz on Discord (haven't implemented yet).

On 31 December, one group released some of their server code on Github, EQOAGameServer . Their server is coded in C#. It has working account management, login, and character creation, but as of the time of writing you can't yet enter the game world (AFAIK).

Combat system

On January 1 and 2 I made a basic combat system, added a healer and pet NPC. In the next couple of days I made a simple combat AI system and tested it with two NPC teams, orcs and elves, fighting each others. The heavy CPU and network load brought up some problems with the UDP network "stack", so I also spent some time fixing that.

ESF file format

The next couple of weeks I concentrated on figuring out the .ESF/.CSF file format used by the game. The server would eventually need information about the terrain and buildings in order to have proper NPC's that don't walk through buildings or mountains.

In previous years there had been some scripts available that could extract single objects (without textures) from Tunaria.ESF, but the server would require the whole world with exact coordinates of terrain, trees, buildings, etc.

With some help from my brother we did that and published our loader code on Github: ESF file format

Example video produced with the .ESF loader: EQOA: from Freeport to Whale Hill, improved rendering

Frontiers compatibility

Around January 21 I got the chance to test my server with Frontiers and did some changes to make it compatible with both versions. I tested the game with Shalkith who was connecting from the US with a real PS2. The first tests revealed some bugs in the network code but in a couple of days they seemed to be ok and I invited more people to try my server, at that point running on my home broadband.

Opening the Sandstorm server

I worked with some stability issues and on January 25 seemed the next step is to rent server hosting and open it for public testing - as far as I know, the first EQOA server open for public since the official servers shut down. The Sandstorm server is currently hosted on Linode in London.

Non-player characters

On February 1 I imported some data gathered by Dustin Faxon and others in the previous years: over 15,000 NPC's (merchants, quest characters, wildlife, monsters, etc.) and the next day implemented a basic coachman system that lets you teleport around the world.

Pathfinding, the hardest part?

When I started the project in December I expected pathfinding to be perhaps the hardest problem coding-wise. Without that, NPC's chasing a player or just roaming would simply go through buildings and terrain.

Devi Ltti joined the discord server in February and offered some good advice based on his experience with Final Fantasy server emulators. He suggested using Recast & Detour for pathfinding. It seems to be a good solution, even though precomputing navmeshes is very time- and memory-consuming due to the big seamless world. I implemented preliminary pathfinding in one zone around February 20. I use the Java port, recast4j.

World map

As far as I know, there hasn't previously been an exact map of Tunaria because nobody's been able to load the geography from the disc before we figured out the ESF file format. I made a Tunaria map on 25-26 February by using our loader code and some code from the Tunaria viewer app my brother made.

Back to main page