Greetings everyone, I'm the network programmer for OotOnline.
Since taking over the network role from Melon a couple of months ago I've rewritten the client and server from the ground up. In this post I'll go into some technical aspects of the project to give you a better idea of what is going into this.
Part 1: OotModLoader
This is the very core of the project. It is a mod loader that I've designed for making Oot mods with netplay support. It gives you a modding API that allows temporary ROM patching, RAM monitoring/editing, and high level actor hooking systems to abstract away much of the meaty bits of modding to get straight to what you really want. The system contains an event bus for detecting basic things about the game state without hooking specific memory addresses. Events such as scene change (pre and post), room change, void out, and link's various states. These events are being expanded all the time as new functionality is required for OotOnline.
The mod loader also contains the Master Server. The server is capable of hosting many individual lobbies of players simultaneously. This works by specifying a unique identifier for your play session and optionally a password.
Part 2: OotOnline
This is the first mod made for the mod loader. It loads a ROM payload that contains our 'puppet' Link actor that represents other players in your game world. It utilizes the mod loader's API to detect the game state and track player movements. A puppet actor is spawned when a player enters the same scene as yourself and remains until they leave or disconnect from the server. Link's position, animation, rotation, and equipment data are monitored and transformed into commands for the puppet that represents you to other people.
The puppet is currently compatible with Adult Link with everything but Iron and Hover boots.
Part 3: SceneSync
This is the scene context module. Its purpose it to sync everything within the context of the scene so that co-op game play is possible. This includes any actors and the scene's switch, chest, and clear flags. Each actor instance is assigned a uuid (Universally unique identifier) to facilitate networked synchronization. The entire actor sync system is dynamic and works anywhere so long as the system understands the actors in play. This dynamic approach should make basic ROM hacks work right out of the box, but more sophisticated ones may require their own mod to act as a compatibility layer.
Current development goals:
We're currently in Alpha. This means we are adding content as quickly as possible. In general our Alpha goals are as follows:
- All major dungeon actors synced.
- All save context data synced.
- Puppet support for boots and Child Link.