Devlog #1 - From Proof of Concept to Online Gameplay

2026-11-08

From Proof of Concept to Online Gameplay

Hey everyone! Welcome to the first FTR devlog. We'll use these posts to show what we're working on and how we got there. If you remember the Emerald Beach clip from July, that little proof of concept has come a long way. Basic 1v1 and 2v2 are now playable online in our new Fantasy Tennis client in Unreal Engine 5.

From ball packets to the Machine City boss

Back in May, the JFTSE GitHub bot posted two commits that wrapped up the work on figuring out the ball packet. That told us what the original client was sending. The next question was how it got those values in the first place. Looking into how character stats affect a shot led to how the game loads characters and their stats. From there it was on to animations and how the game decides which one to play. One thing kept leading to another. Add missing ball actions, Proper naming ball animation packet

I'd always wanted to make my own tennis game, something like Fantasy Tennis. I already had a little tennis project going, so when our internal tools could export a full model with its animations, I had somewhere to try it. I imported the Machine City boss, got him running with his original animation and shared the clip with WongKit on Discord on June 6.

We could already add new items to FT, but it took a lot of manual work. Now we could pull a complete model and its animations out of the original game files and bring them into Blender or another engine. Seeing the boss run around in that little project got me thinking. How much of FT could we get running in a new engine? And if we could get it playing like the original, how much easier would it be to make our own courts and items?

Emerald Beach and a very still Niki

On July 8, I posted the first proof of concept. Emerald Beach looked just like it did in FT. The models and textures came straight from the original .dat files and the court came across without broken meshes or visual glitches. The original ran on DirectX 9. Here it was running in Unreal on DirectX 12.

Niki was there too, standing very still. His animations weren't hooked up in the client yet, but seeing him on court showed that we could export a character as complex as him too.

The tennis itself still needed work. You can see the slice and lob go wrong in the clip 😄. I said on Discord that the goal was to get a basic online 1v1 and 2v2 proof of concept running by the end of the year. Fair enough if that sounded ambitious. We still had to get the ball right.

When it started to feel like FT

By July we already had the original shot settings and the two curves that make up the ball's path. A lot of the work after that went into the details. Where does the racket make contact? How do your character's stats change the shot? What happens when you play that same slice from a different spot on the court? Those little differences add up when you've spent years playing the original.

On October 29, I posted the first clip of a match against a bot. WongKit asked if the ball physics had been reverse engineered because they looked so close to the original. Yep. The best part for me was sitting down for a rally and realizing it finally felt like FT on the keyboard.

Now there's someone on the other side of the net

More of the team is working on the client now and since that bot clip we've got Basic singles and doubles working online. You can join a room and play a match with other people 😄. (There is no sound, I forgot to record it - sorry for that 😝)

We're still using JFTSE's login and game servers for signing in, choosing a character and getting into a room. Once the match starts, FTR uses a custom match server. Fantasy Tennis uses the emulator's relay to pass ball and animation updates between players.

We needed a server that could run the match itself, so there's one place deciding whether a return connected, where the ball landed and who won the point.

When you press a movement key, your client starts moving your character right away. It checks that movement against the server's updates and adjusts if needed. If a return arrives a little late because of the connection, the server can check where the player and ball were when the swing happened. That lets us keep the controls responsive while the server makes sure everyone gets the same call.

Next up - public network testing

We want to get more of you on court and see how it feels across different connections. Can you still time your return the way you expect? Does a fast rally feel right? What happens when two teammates go for the same ball in doubles? Those are the things we want to hear about from people who've played FT for years.

We'll post the details on Discord when the test is ready. Thanks to everyone who's been following along since the Machine City clip or the one where Niki just stood there. It'll be fun to finally play a few points together.

- XxharCs