Improving a childhood game: Disney's Toontown Online

Revisiting an old, dead, Disney MMO.

A picture of Mickey's Toontown at Disneyland Park.
Photo by taylor gregory / Unsplash

One of my favorite games as a kid was Disney's Toontown. It was an MMO with turn based combat released in 2003. Unfortunately in 2013, Disney killed the game for good, pushing players towards Club Penguin. However, through hundreds of hours of reverse engineering, reimplementing, and porting, you can have your very own private server for Toontown.

Background

Toontown was written in Python 2, using Panda3D as it's engine of choice.

Panda3D | Open Source Framework for 3D Rendering & Games
Panda3D is an open-source, cross-platform, completely free-to-use engine for realtime 3D games, visualizations, simulations, experiments — you name it! Its rich feature set readily tailors to your specific workflow and development needs.

While I know nothing about Panda3D (I just compiled it and installed it) it was also used to power another game Disney was working on: Pirates of the Caribbean Online. This will be relevant later.

There have been many private servers that have come and go, that listing them all is probably not even possible. Due to conflicts and drama, various sources have been released to the public. This is relevant as it allows me to take a look into the game's inner workings, and add some features that are sorely needed.

In particular, various teams have ported the game to Python 3, which makes working with the codebase way easier.

With that said, some improvements I've added to my copy of the game are from various community members throughout the years and without them I wouldn't have been able to relive my childhood game, my way.


Improvement #1: Client Sided NPCs

For some reason, Disney decided to have server side NPCs (or a queue system, essentially) But this means if you have more than 1 people trying to talk to an NPC you have to wait in a line. While Disney probably did this to foster the MMO experience, it's annoying in 2024. Even if I'm playing alone, it bothers me enough to fix it.

Luckily, it's only a simple change. The fix is essentially when we check if the NPC is busy, we add the player to an array, rather than just setting their busy variable to one player.

A screenshot of a code change, having 2 lines removed, and 4 added.
This is essentially the fix, just done in multiple places across the game. We also remove the player when they exit the interaction.

This single change makes playing the game with other people (or multiple Toons if you're me) way nicer, since multiple people can be doing what was blocked before!

0:00
/0:03

Two other Toons are actively using the shop, I can now use it myself as well.

Improvement #2: Sprinting

Getting anywhere in this game is painful, because you walk at such a slow pace. So, adding sprinting was a no brainer. There is actually an admin sprint mode accessible through privileged chat, however I wanted traditional sprint.

Of course, this was also relatively easy to add, since sprinting in most games is three steps.

  1. Check if you are holding Shift
  2. Move FOV back to indicate running
  3. Increase Movement Speed

Simply put, that's what you can do in Toontown too!

def startSprint(self):
    base.localAvatar.lerpCameraFov(base.genFOV + 20, 0.5) # move fov back
    base.localAvatar.currentSpeed = SprintSpeed # add speed
0:00
/0:03

Now I can finally go fast!

Improvement #3: Custom Keybinds

One thing this game really needed was key remapping. I don't want to use my Arrow Keys and Control to jump, since I'm on a Mac and a combination of those is an OS hotkey to rearrange your workspace.

While this one I could've figured out on my own, I need to give a huge shoutout to DarthMDev over on GitHub because without him doing the work already, I would've been working on this for weeks.

DarthMDev - Overview
Loves to program 💻 , game 🎮 and lift weights 💪 Technology enjoyer 💻 Linux and MacOS user - DarthMDev

We essentially overwrite the hardcoded key checks to ones that read from a JSON file to determine what keys should be. This causes an issue though, because typing on the keyboard prompts the chat to open, however it's an easy fix. We check if the user bound any keys away from the arrow keys, then just require a specific "chat" key to be pressed first before opening the chat.

A screenshot of Control Settings, showcasing movement keys set to W A S D.
Complete with a custom menu, I can finally play with WASD.

Improvement #4: Orbital Camera

Remember Pirates of the Caribbean Online from earlier?

Well it turns out they had an Orbital Camera.

This allows you to control the game with your mouse, rather than the arrow keys. You can get around so much faster with this method I'm shocked Disney never backported it as a secondary method to Toontown.

By using the OrbitalCamera script from Pirates, most of the hard work is already done for us! Again, huge shout out to DarthMDev, without him doing this work a couple years ago I would've had no idea where to even begin adding something like this!

0:00
/0:06

Conclusion

Hacking up the source code of Toontown is really interesting to me, even as an "adult" because I can use it to further my skills in the real world. So while it may just be a children's game, it's at least a decent thing to be wasting my time on. I'm probably not even going to beat the game, but I've already gotten a ton of enjoyment out of it.

Now the game crashing at every opportunity is another thing...

Permalink: chse.dev/toontown