Rivals on Switch: The Biggest Challenge of my Career
Intro
For those of you who don’t follow us, just this week we announced that Rivals of Aether is coming to the Nintendo Switch on September 24, 2020.
For those who have been following our development, you know this has been a VERY long time coming. We knew we wanted to bring our game to the Nintendo Switch as soon as the console was announced in 2016. At that point we were still in development on Steam Early Access and Xbox Game Preview and we were working toward a full launch in Spring 2017.
In the fall of 2017, we began putting effort into bringing our platform fighter to the Nintendo console and that winter I publicly posted that we were looking into it. Rivals of Aether is a fighting game inspired by the colossally successful Super Smash Bros series. There was a lack of games on the Nintendo Switch for its first two years and indie developers filled the gap and found massive success. In our minds, getting the game to Nintendo fans as soon as possible was a big focus to our development.
But now it’s three years later and Rivals of Aether is finally arriving to the Switch long after the indie gold rush has ended. So what happened?
The Porting Days
When the Nintendo Switch was released in March 2017, we didn’t have a clear path to the console. Our engine of choice (Game Maker Studio) did not have a public export option to the console at the time. So we began reaching out to external development teams that would be able to port Rivals of Aether out of Game Maker Studio and onto the Switch.
We first found a team that was writing what could best be described as a Game Maker Studio emulator that would be able to run games on Switch. After exploring that route, it presented a few problems for us because our netcode at the time was an extension and netcode in general would be extremely difficult to run through an emulation. Also running a game that wasn’t perfectly optimized would be difficult. Since Rivals is a 60 FPS fighting game where every frame mattered, we realized that emulating the game on Switch was not going to be feasible for us.
Later in 2017, we began speaking to another team that would rewrite Rivals in their own custom engine. This team had already ported and launched a few games on Switch and they were extremely professional and competent. The biggest challenge was that they weren’t incredibly familiar with Game Maker Studio and preferred to port projects from other engines.
Still, we began discussing a path to bring Rivals to Switch with them. They investigated the game and looked at our reviews (positive and negative!) and came back with a list of changes they would make for their ported version of Rivals. The first two changes on their list were rollback netcode and four player online support. I was ecstatic as those were two features we were already prioritizing in our own development timeline.
For this plan to work, we would want the game to be content complete to turn it over to the studio for them to port it. In Fall 2017, we had just released Clairen and Ranno and had already announced we would be releasing three more characters. We were working hard on getting these characters done so we could turn the game over and let the other studio jam on it. Since we had some time to finish the characters, we took a few months to sort out the details of the agreement and were targeting a Summer 2018 hand-off.
Then on March 9, 2018, YoYo Games announced that Game Maker Studio 2 would be officially exporting to the Nintendo Switch at GDC 2018. The development path of Rivals of Aether took a hard-turn. The porting team reached out to me first after the news dropped to let me know that they didn’t want to continue a collaboration. They already had their hands full with a ton of projects and they weren’t especially excited or interested in Game Maker Studio porting. They advised that this would be the best for both parties because we would still be able to control the development and release our own balance updates and patches even after launching on a console.
I was personally crushed as I was looking forward to having an experienced and professional team take the optimization and netcode off our hands. But I understood the decision from their perspective and I did like the idea of having more control over our final product on consoles. So we began the journey of getting our game onto Switch as a Game Maker Studio 2 game which started with migrating our game from Game Maker Studio 1.
The Netcode Overhaul
In early 2017 while we were still working on our full launch, we realized that we did not have a path to launch our game on the Nintendo Switch with online multiplayer even if YoYo Games was going to release a Switch export. The netcode for Rivals of Aether was written by an external team back in 2014 and 2015. We enlisted the help of the Canada-based Code Mystics Inc. and they created an awesome external solution for Steam and Xbox One. Our original deal was only for those two platforms, so we began looking for a way to do our netcode inside of Game Maker Studio so we could bring the game to more platforms.
We came across the programmer YellowAfterlife and it was a match made in heaven. YAL was already making great strides doing netcode related work in other Game Maker games such as an online multiplayer version of Nuclear Throne. The moment we began bringing Rivals over to Game Maker Studio 2, we also began converting our netcode away from Code Mystics’ system and toward YAL’s netcode framework.
The conversion was a long process. We had a lot of improvements that we wanted to make now that we had more control over the system. We increased our player limit from two to four players after hearing many requests throughout development. We also improved our matchmaking by adding region filtering and better ranked searching after similar complaints throughout development.
In order to develop these new features and keep progress going on Rivals of Aether, we split the game into two branches. One branch had the new netcode and one had old netcode and acted as our live branch on Steam. We hired ampersandbear, another Game Maker programmer, to come on board and to be in charge of implementing all the new netcode features now that our scope had increased.
The netcode changes contribute for our biggest delay in coming to Nintendo Switch. While we planned out our features in 2017, it wasn’t until August 2019 that we finally launched a Netcode Open Beta onto Steam. This was still not the live branch on Steam and players had to navigate to a Steam beta branch to opt into testing it.
Even after we brought the new netcode to Steam, we have been fixing bugs related to the online lobbies for almost a full year now. The complications of going up from two player max to four player max were not something we were anticipating. There are so many more scenarios and opportunities for bugs to arise with disconnects or menu variables getting out of sync with four players than there are with two.
Testing also became an issue for our small team as in the past, we could get by with one programmer on two PCs or two programmers to track down and fix all the bugs. But with four players and difficulties recreating bugs on virtual machines, we ended up having to schedule MANY testing sessions with four programmers in order to see what was fixed and what was still broken from the previous session.
Even with all this testing time and the player count increase, two years seems like a long time to get a playable version of the new netcode. But a big part of that is because we spent a lot of time trying to convert our game from input-delay to rollback netcode.
The Rollback Years
For those of you who aren’t familiar with rollback netcode, there is an amazing Fightin’ Words by Infil that explains the feature and how it works.
As a brief overview, rollback netcode is a method of handling latency that reduces the input delay in a game by predicting what happens and then rewinding and fastforwarding the game if the prediction was wrong. This method is important for fighting games because you want to reduce the input delay as much as possible in order for the game to feel responsive and similar to playing at a local tournament. The downside is that laggy connections can have some teleporting or animation skips but most players would agree that the pros outweigh the cons.
Most of the time, it is much easier to implement rollback into a new project than it is to retrofit it into an existing project. This is because you need to have your game state as optimized as possible to effectively save and load it during each frame without causing any delay.
Fighting Games run at 60 FPS. So in order to have your game run locally at 60 FPS, you need to have your game logic and draw logic fit inside 16 milliseconds or the game will lag. Doing this in a standard game locally is really no issue. Unless your game is not optimized or you have a ton of objects on screen that affect gameplay *cough* Elliana steam, Orcane bubbles, Etalus ice, Sylvanos grass *cough*. But even still, because you only need to update the game logic once and draw the screen once, you should be able to run most games at a stable 60 FPS as long as you optimize well and lucky for us we had Juju Adams on our team to help optimize our multiple object characters.
Rollback on the other hand has stricter requirements. First you need to separate any visual logic from the game logic. Luckily for Rivals we already had done this to handle our delay-based online but still had some bugs now that we needed to rewind. Next, you need to be able to fit saving the game state, loading the game state and running the game logic update as many times as your max rollback frames - all within 16 milliseconds. A good max rollback would be around 20 frames while a more visually demanding game might settle for 10 frames.
We started working on rollback netcode in late 2017. Initially our state saving and loading was not optimized, even without any rollback we were far above 16 milliseconds. Our game was running at 1–2 FPS. After spending months optimizing the game and making sure we were only tracking necessary variables, we were able to get the saving and loading and one game frame under 16 milliseconds so the game would run at 60 FPS. But we had barely any room for any rollback to happen and with more than 2 players on screen, we were still having framerate issues without any rollback.
In the Summer of 2019, we had to make a call. YellowAfterlife and I had already spent 16 months working on the netcode and optimizing our game state. It was increasingly difficult as the live branch was adding features and changes that needed to be pulled into the rollback branch. We were struggling to test 4 player features because the rollback netcode was not stable or at speed and we still had some remaining desyncs.
We ended up pausing our development of rollback so we could finish the game and launch in a realistic time-frame. We were able to bring the optimizations and some improvements to reduce the input-delay from our previous netcode but we were still super bummed to shelf rollback. As players we know how important input delay is to playing a fighting game, but as developers we also realized we wanted to ship the game eventually. At this point in time, it’s hard to say if we will return to working on rollback. We laid out most of the groundwork to get it working but there is still a lot of work to be done to be able to release it. It would also be a huge undertaking to make it compatible with our Steam Workshop support that we added in 2019 because we would need a system to track all the variables that creators are making that can affect the game state.
In the end, even without rollback, we had a ton of work ahead of us. It’s now a full year later and we had all kinds of bugs to fix. But with a good chunk of our team working on rollback and netcode updates, the rest of the team didn’t just twiddle their thumbs. We started packing the game with more content as we made a push for The Definitive Edition of Rivals of Aether.
The Definitive Edition
When we first started talking about doing a “Definitive Edition” of Rivals of Aether, what we meant is that we were going to combine the base game with the 6 DLC characters and sell it as one package. And that was going to be the whole game!
As we ran into issues first converting the netcode then making it work on console, we had artists and designers on our team with their to-do lists cleared out. We brainstormed all kinds of improvements for Definitive but because we also felt like the netcode would break through and finally be stable at any moment, we didn’t want to commit to any big features that would delay the release of the game. We didn’t want to run into another issue like we had earlier where our planned unfinished content was delaying our hand-off to the studio that was going to port rivals. So we planned around adding “smaller” features that wouldn’t put us in a bind. But no feature is ever as small as your first anticipate.
From the beginning, we knew that one part of the Definitive Edition is that we would be adding Abyss Mode support for the DLC characters. In this mode, you could unlock a set of equip-able powerups for each character. We didn’t create them for the DLC characters on their launch because they take a lot of time to design and develop and we didn’t want to delay the character releases. We had Trevor and Ellian go back and work on Abyss upgrades in between balance changes, skins and other demands of a live multiplayer game.
Next we knew that we were prioritizing a Switch release and Switch doesn’t have achievements like Steam, Xbox and Playstation have. So we discussed adding a new system to replace achievements that could exist both on Steam and Switch. This is how we stumbled upon the Milestone System. If you are confused how it works, just watch the video by Adam Carra above and then you should be able to understand it perfectly. Ellian worked on new full resprites for Zetterburn, Wrastor, Forsburn, Elliana and Absa. Then we had Cannonbreed and flashygoodness work on new stage skins for Tower of Heaven, Aethereal Gates and Troupple Pond.
As we were approaching April 2020, we remembered our tendency to make April Fools jokes that are far too big and not worth the time or money. In 2018, we did a parody of a Nintendo Direct called Rivals Direct. In 2019, we released an entire free game on Steam called Lovers of Aether. So this year, we knew we had to do something even better. We ended up going back to the very first April Fools joke I had made which was a blog post from 2015 - long before we had any fans. The joke was we were changing Rivals of Aether from a fighting game to a tetherball game simply because “Aether” is one letter away from “Tether”. So thanks to that dumb joke, we had Trevor, Cannonbreed and flashygoodness spend a month and a half of their time making tetherball into a real mode for Rivals of Aether Definitive. We also then made it part of an even bigger Rivals Direct 2 which revealed a lot of new stuff that was coming out and even teased stuff we will be working on past 2020.
Finally for the Steam version of the game, there was another massive feature we added as we pushed toward Definitive. In Fall 2019, we launched the Beta for Steam Workshop. This was headed up by ampersandbear and YellowAfterlife. We also hired an artist Danieru to make an example character with Trevor. We had George working on the reveal trailer and flashygoodness creating the stage editor so we had all hands on deck for this feature in 2019. And it was worth the investment — the Steam Workshop blew up and pole-vaulted Rivals back to a very active and visible community on PC. We even hired Giik, who was a prominent early workshop creator, to help finish our features. Steam Workshop will be part of the base game in the Definitive Edition on Steam and we plan to keep supporting it for as long as people are interacting with it.
Then with all these features came increased online support. Workshop characters need to work online as does Tetherball. We also finally added Abyss Runes to online play as well as Abyss Endless for online play in the Definitive Edition. With all we added, hopefully an entire year of testing and bug fixing starts to make more sense.
Switch Development
Another part of the process that took a long time was developing for the Switch. We’re a small team and we don’t have a publisher. You may have noticed that over the years many popular indie games release with a indie game publisher such as Devolver Digital. That’s because there are tons of details that go into launching a game that have little to do with actually making a game. Publishers often interact with platform holders, make capsule images, write store descriptions, get official video game ratings, upload builds, handle localization, fill out certification forms and even more for the submission process. They have also done it before so they know where the hangups are on each platform. This kind of work isn’t just a job, it’s often multiple jobs. Not only that, many publishers also help out on marketing, social media, physical copies, merchandise, cross-promotion with other games, and external media like comic books.
But Rivals of Aether is self-published and has been since we started. Self-publishing is definitely achievable for indie developers and we like it because we have complete control over the world of Aether. But it also means that some tasks take longer. With the exception of marketing and social media tasks falling on our community manager, George, and our esports manager, SBS, most of the publishing tasks fall on me. And unlike publishers, each platform is new to me. So often there are pieces of the puzzle that I need to learn including submissions, ratings and store assets that take much longer than they would if we had a publisher.
In addition to publishing tasks, developing and testing on the Switch had multiple unanticipated challenges to overcome. Initially we only had 2 developer kits among our small team, but that obviously wasn’t going to work for testing out four player online support. We ordered another kit and hired another programmer with access to a kit to help us with the Switch development. This allowed us to start testing with four players but we still had some major bugs and needed to reach out to YoYo Games, the creators of Game Maker Studio, multiple times for assistance. Shout-out to Fritz. Rivals on Switch would not have been possible without him.
Development was going pretty smoothly until our programmer focused on helping us on Switch left the project. We had to scramble to get another kit to even get back to four player testing which cost us a couple months. We also ran into issues in our submission process trying to figure out some of the systems that the programmer had set up before leaving.
Finally just that fact that Rivals of Aether is a game that features online multiplayer was a challenge. There was a lot of time just setting up dev kits and test accounts and reading documentation and getting help from Nintendo. Developing a single player game has a lot of perks when it comes to functionality and porting to other platforms. There are less features to hook into and less to test. I’ll remember that for my next game. Who am I kidding, though? No, I won’t.
The Pandemic Delays
Finally the last piece of our struggle is something that no one really expected and that was a global pandemic slowing down most of 2020. When we announced in January that Rivals of Aether was coming to the Switch in Summer 2020, we were actually targeting Spring at that point. We had been making good progress in the Fall of 2019 and were looking to March or April and the Summer announcement was a backup plan.
But because of our delays in testing out four player, we started to fall into spring. That’s where trouble arose. For Rivals, we decided to work with an external QA testing team for Switch certification. The plan was that they would help us find any many issues as possible before submission since we had heard through other developers that Nintendo was strict in their submission processes.
When we reached out to our testing team in early May 2020 that we finally had our game ready to go, the pandemic was already in full swing. Since they are an external and remote testing solution, many big studios that normally would do testing in house were leaning on the same QA team as us. Their schedule was slammed and we weren’t able to get an appointment until over a month later around the end of June 2020. This is when we first started to see an impact but were still optimistic to release in July or August.
Once we were scheduled with the QA team, the testing went well and we were able to find a slew of bugs and fix them within a busy week and a half.
But we should have realized that the delays would also spill over into Nintendo’s own approval process as the pandemic was impacting North America, Europe and Japan all at once. The testing and approval times were understandably longer than normal and we sat with a completed build for months.
The Summer of 2020 featured the most stressful couple months in my game development career. I dealt with uncertainty of the pandemic, changes in my personal life and waiting days for emails to arrive so we could figure out our launch date. All this while fans across our social media let us know that “Summer is almost over. Where is the Definitive Edition?” It didn’t help to be passed over by Nintendo for their August’s Indie World presentation as we were toiling away in their review process.
Conclusion
In the end, Nintendo did what they could to help us and we made it across the finish line and finally have our launch date. And after years of trying to get our little game on Switch, I can finally say it.
Rivals of Aether is available on the Nintendo Switch. You can buy it on September 24th.
This day has been a long day coming and for many days felt like it would never happen. Our team poured everything we could into the title and I hope you check it out.