Net64
Net64 is a modification for everyones favourite 3D Mario: Super Mario 64. Cooperate with your friends to collect all 120 stars and show Bowser who's boss - or just beat each other up. The modification consists of a separate application that establishes a connection between Super Mario 64 and the internet.
Credits
Blog
Hi, my name is Mario!
I’m a software engineer with a passion for my side projects. This is also why SMMDB and Net64 exist now for several years and are still in use.
The idea I initially had when I started 2017 with SMMDB was to make Super Mario Maker usable on emulators, but I soon had the idea of making it playable in your browser. With modern HTML5 technologies it is nowadays possible to create games with near native performance. These technologies specifically are WebAssembly and WebGL/WebGPU. As a developer with a background mainly in frontend development and due to my love for performance, I started experimenting early with these technologies and soon became interested in the Rust programming language. Learning Rust filled me with joy, which I have never felt using another language, but let’s keep it like that.
Since the Rust gaming ecosystem was still relatively immature at the time, I postponed the idea and devoted myself to other projects, namely Net64+ and afterwards sm64js. In the meantime Super Mario Maker 2 came out, so I was thrilled to work on SMMDB again and implement proper support for it. Since the Switch console was selling much better than the Wii U, this also flourished the homebrew ecosystem and other people almost had everything reverse engineered, that I needed to know.
After waiting for several years now it is time to move forward and do what I wanted to do and this is why I start a new project called Shroom Kingdom. If you go to the website, the first thing that will catch your attention will be the blockchain integration. Several people have already told me, that this is not a good idea and actively tried to stop me. I think this comes from a misinformation about blockchain in general. Many people try to stop what blockchain stands for and if you don’t take a deeper look into the technology, you can soon develop a bad attitude towards blockchain. What people most refer to is the immense amount of energy the blockchain requires to operate. This is however only true for blockchains that use Proof of Work (PoW) as its consensus algorithm. I have also the opinion, that PoW can be easily abused and hard to regulate where the energy that flows in comes from. However there are other consensus algorithms, that don’t have these problems like Proof of Stake. This is one reason why I chose NEAR Protocol as my favority blockchain platform.
Another argument that gets mentioned often is that Non Fungible Tokens (NFTs) are bad. No one could tell me why though and all I can tell you is that NFTs are literally just arbitrary data stored on the blockchain. What you want to do with that data depends on the platform, but most people use it to store and share art. The biggest benefit that NFTs give you is true ownership of an asset. This also makes it possible to add utility to your NFTs, e.g. imagine an RPG game where every piece of armor you acquire is actually an NFT on the blockchain. The NFT would directly impact the game itself and this is what most projects in blockchain gaming do. Blockchain gaming is booming in general, which is also why js13kGames added a decentralized category. In the case of Shroom Kingdom every level is an NFT. The utility that gets provided is that you can play it. Levels will have even more utilities, but the details have yet to be determined.
NEAR Protocol or blockchain in general also allows me to get the funding that I need to work on this. So this started another argument about how I earn money from an intellectual property which is not mine. To be able to play on Shroom Kingdom, you will need game assets from Super Mario Maker 2. This can be done by dumping game files from a real console and extract the required assets. I don’t want to encourage people to pirate the game to be able to play on Shroom Kingdom, which is why I will also implement support for game mods. There is a huge amount of custom assets, that can instead be used, if you don’t own the game and the console. Even though the analogies are obvious, I will not use any copyrighted content.
Shroom Kingdom will be a so called play-to-earn game. At first it sounds intriguous, but in fact it is again the blockchain that enables this new kind of games. By participating in the game, you will earn a Fungible Token called $SHRM, which you can exchange for other tokens or real world money. The $SHRM token would not have any value except using it as a currency, if it would not have a utility in-game, so $SHRM will be used to unlock new building blocks or upgrade licenses, e.g. increasing level upload limits.
To stay up to date with the latest news about this project, you can follow us on the following platforms:
Hey everyone, we have an important update about Net64 for you. And no, this is not a late april fools joke ;)
We would like to announce that Net64+ will from now on be in a passive maintenance mode, meaning Tarnadas will no longer develop new features. That does not mean the project will be abandoned. The server list will stay online and everyone can host their own server by following our wiki. The client and server are also open source and Tarnadas will accept new Pull Requests as always.
The development of version 3.0 will also be halted. Not only is progress slow because only Henrik is working on it but with the release of the SM64 decompilation many other multiplayer projects have emerged. These projects ported SM64 to various platforms like Windows or the web and are far easier to set up, easier to develop and therefore far better supported. Even if Net64 3.0 would release today these other projects would be superior in every way. We don’t feel like working on something that will be obsolete before it’s released.
Net64 was the first SM64 online mod. It was groundbreaking at the time but nowadays the SM64 decompilation has allowed much more complex mods to be developed by a much wider group of developers. Don’t be sad that Net64 has reached its end of life, these projects are the logical and spiritual successors of Net64. Net64 will remain an option for ROM-Hacks and speedrunning but everyone looking for more characters, maps, gamemodes or better synchonization will hopefully appreciate these new projects.
SM64ex-Coop
SM64ex-Coop is one of these new ports. It’s an online mod that is based on the popular PC version. That means all features of the PC port come with it: Infinite drawing distance, 60FPS, custom textures, you name it! The mod currently supports two players and doesn’t require a server. Almost all objects are synced and the team is constantly working on improving it. If you want to play Kaze’s splitscreen mod but can’t get your friend over because of some virus thing, this is the perfect mod for you! Check out their Discord for instructions, development updates and custom content.
SM64DS Online
The name says it all. It’s still in development so don’t expect to play it today but it’s looking very promising. Check them out:
sm64js
sm64js has a very simple premise: How cool would it be if you’d rewrite SM64 to run in the browser? Well, turns out very cool! Not only can you play SM64 on virtually any device now, but because the game is no longer restricted to technology from the previous millennium you can basically add anything you like. Are you tired of setting up laggy emulators and configuring controllers? Did you ever want to make a custom boss, course or gamemode in SM64 but you gave up because it was too difficult? sm64js is going to change that. As the name suggests it’s based on JavaScript so modding is a piece of cake. And it gets even better: Since it’s already running in the browser, wouldn’t it be cool to have an MMO mode? Yes, it’s basically Club Penguin in SM64!
It’s not finished but you can already try it on their website. Almost everything you’ve been asking for in Net64 3.0 is already working in sm64js or is in development: More players (hundreds?), custom models, different mario colours, custom gamemodes and object syncing.
Just recently, their MMO server has been switched out with a faster one written in a new programming language called Rust. After ironing out the last few bugs the team thinks it’s ready to be battle tested. They expect it to support hundreds of players at the same time, but there is only one way to find out for sure: A stress test is scheduled to start at 2021-04-17 17:30 UTC and everyone is invited to try it out. Check out their website and join the Discord to learn more:
How does it work?
sm64js is a rewrite of SM64 in JavaScript to allow playing Super Mario 64 in the browser. The regular SM64 decompilation has also been modified to be compiled to WebAssembly via Emscripten. WebAssembly is a relatively new programming language, that also runs natively in your browser, just like JavaScript.
So you might ask yourself, why you’d want to rewrite the whole game in another language like JavaScript?
There are several benefits:
-
Extensibility: JS is a more widespread language, more people can develop custom content
- Rapid Prototyping
- Compatible with modern software packages
- Better modularity. Easier to add custom gamemodes and content
- Portability: Runs on any device with a web browser; no need to download or install anything
- Opportunity to refactor / rewrite with modern coding style and cleanup
SM64JS also includes online mass multiplayer versions and other custom multiplayer game modes. This is also why Tarnadas got interested in joining the team. Due to the experiences gathered while developing Net64, it looked like the perfect fit. At first, the backend of the MMO version was developed with Node.js, which was also used to develop the Net64+ server with up to 24 players. It has a decent performance, but for an MMO with hundreds of players, CPU performance can become a bottleneck. Several performance improvements were made to the Node.js server in the beginning, especially by switching the WebSocket libary with a native Node.js module written in C, but Node.js struggles to easily achieve a multithreaded and scalable architecture.
This is where Rust comes into play. Rust is a system programming language developed by Mozilla since 2013 that runs lightning fast, avoids memory errors and guarantees thread safety. Rust has also seen great adoption by big tech giants like Google, Microsoft and many others. Rust became Tarnadas’ favorite programming language, because once you have learned the core principles and gotten used to the compiler, you can easily write software that “just works”. People often first think that having such a strict compiler might slow down development, but in fact you don’t want to struggle finding out about bugs during runtime. Every error that gets found during compile time is an error that you don’t have to fix during runtime and fixing compiler errors is much easier and more straightforward.
The End?
So here we are. It’s been three and a half years since Net64, back then called Super Mario 64 Online, was released. Lots of stuff happened. Back then everyone and their mother played Net64. It was simple and addictive. Over time the project matured and more features were added. With time popularity decreased and so did development activity. For Net64 this is the end of the line. Of course it would have been nice to revive Net64 with new features, but at the end of the day Net64 is just a name. Other projects will continue what Net64 started.
Lastly we want to thank everyone who made Net64 to what it became:
- MelonSpeedruns, for turning a childhood dream into a real thing.
- Kaze for developing the assembly and making the mod go viral.
- Guad for developing the first client.
- Marshivolt, Cjes and TheAnkleDestroyer for creating the character models.
- Our ex-Discord staff: Marionova and Jim-panse for building the community from the ground up 61 6e 64 20 44 61 6e 67 65 72 6c 65 73 73 20 66 6f 72 20 62 65 69 6e 67 20 61 20 67 69 61 6e 74 20 70 72 69 63 6b.
- Our current Discord staff: Bill and Jman for supporting us and keeping the server alive.
- All server hosters for providing the community with servers to play on without portforwarding.
And of course thank you for playing! It’s been a pleasure to be part of project with such a passionate community.
Henrik, Tarnadas
Contents
The Current State Of Net64
You probably noticed that updates to anything regarding Net64 have become increasingly sparse and even if they happen they usually do not contain many changes. This is still the aftermath of Kaze (the initial developer) leaving Net64 over a year ago. Since then his part of the Net64 codebase has remained unchanged since it is not documented and we couldn’t find anyone who is able to work on it. As such we’re not able to build on it further.
The Plan
Being stuck to using Kaze’s code without being able to modify it to incorporate new features or more importantly fix existing bugs is a major setback for us. To regain control over the Net64 codebase we decided it is time for a fresh start. Yes, you heard that right. We’re rewriting Net64 from scratch.
Net64 3.0
If you’re a member of our discord you probably heard of the new Net64 version dubbed as the “coop version”. This is the work in progress rewrite of Net64. A lot of things are different about it. More attention to the more technical differences between this and the existing version of Net64 will be given later in this post but here’s a broad overview of what Net64 3.0 is doing differently: We want to sync every intereactable object in the game. That means you no longer play in separate worlds where only the player models can interact with each other but be able to cooperatively interact with the environment. If a player collects a coin it disappears for everyone. The coin counter will increment for everyone and if this was the 100th coin to be collected in the course a star will appear for everyone. We’re also changing the way the client works. Instead of launching Project64 and Net64 and then hoping Net64 detects the emulator the new client is the emulator. This reduces the amount of problems users have when trying to setup Net64 and gives us greater control over Super Mario 64. The new client also works on 32bit Windows and Linux. If a talented macOS user would like to help us out a macOS version of the client would be possible as well.
Of course syncing every object in Super Mario 64 is going to take quite a while. To not keep you waiting the whole time we’re planning to publish a demo in the near future. The demo will contain a single fully synced course. The development of the rewrite has been opened up. The development channel is public on our discord so everyone interested in the development can follow it or paricipate in it.
The Technicalities
We now told you what we want to do. Now it’s time for telling you how we’re going to do it. So here’s a short summary of the technical differences between the current version of Net64 and Net64 3.0. Note that most of these changes are invisible to you as a user but instead allow us to do more advanced stuff with Super Mario 64.
ROM-Hack Not RAM-Hack
You probably know that Net64 just requires a copy of stock Super Mario 64 (US Version) to work. But where do the player models and custom abilities come from? Well, instead of modifying the ROM like traditional ROM-hacks Net64 inserts models and custom code into the N64’s RAM. This has the advantage of not requiring modifications to the ROM and being relatively simple to program. The disadvantages however are that it sometimes simply doesn’t work, it might require loading a savestate and it doesn’t allow us to modify everything in Super Mario 64. As we think the disadvantages of a RAM-hack outweigh the positives we decided to develop a ROM-hack for the rewrite.
No Assembly
Traditionally Super Mario 64 modifications are developed in MIPS assembly. Like pretty much all assembly languages MIPS requires extensive knowledge of the underlying CPU architecture. To make development easier for us we are going to use the C programming language for Super Mario 64 related logic. This not only makes the code easier to maintain but because C is a lot more widespread than MIPS it also allows more people to join the development.
An Embedded Emulator
Currently Net64 and the emulator (in our case Project64) are two separate programs. Net64 uses Windows functions to act like a debugger for Project64 so that it can access Super Mario 64’s memory. This has been an easy solution since we can rely on Project64 to do most of the work (controller mapping, window creation, etc). Sadly this approach is very unreliable. In fact most people who try to play Net64 fail at this exact step. To counter this problem we embedded the popular Mupen64Plus emulator into the new client. It is now a single program so you just have to join a server and the emulator automatically starts Super Mario 64. There are plenty of benefits of doing it this way but the usability aspect alone makes this the superior solution.
A Reliable Interface Between Client And Game
To make the more advanced synchronization work we need a good way of telling Super Mario 64 about events that happened to a remote player. For example where players are, which objects are synced, when a player joins, if an object was interacted with and many other things. This sounds easier than it actually is. Don’t forget that Super Mario 64 normally doesn’t even know there is something like a client or even the internet in general. Currently the client just reads the local player’s position (and some other properties) from a fixed location and writes the remote players’ positions at another fixed location. For what Net64 currently does this is sufficient. For more elaborate internet play this solution will fall apart. Syncing non player objects requires more than just sending positions around. Objects are created, modified and destroyed all the time in Super Mario 64 and all those events have to reach the remote players. With the current solution those events could be missed accidentally or be sent twice to every player. The players would graduately desync over time. To prevent this we created a protocol that ensures events (or messages as they are internally called) are received perfectly in order and without getting lost or magically doubling. It’s like a network tunnel from Super Mario 64 to the Net64 client.
Super Mario 64 sending coin collected messages into the client’s console.
So here’s an overview of the architectural changes between Net64 2.0 and Net64 3.0:
Any Caveats?
Yes. Unfortunately there are a two features of Net64 2.0 that we’re not planning to port to Net64 3.0 in the foreseeable future. These features are romhack support and custom characters. Now before you send us into GBJ for doing that listen to us. We have good reasons to do so:
Unlike just syncing player positions full object syncing requires every object to be treated differently. We can do this for stock Mario 64 but not for every possible romhack out there. When we’re done syncing the core game we might contact the developers of some popular romhacks to help us make them work in Net64 3.0 as well but it’s a long bumpy ride until then so please don’t ask us which romhack will get support before we even released a playable demo.
Custom characters would theoretically be possible but every character model that doesn’t exist in stock SM64 would need to be shipped with Net64. We are legally not allowed to do this and since we want to stay on the safe side with Net64 3.0 we’ll refrain from doing so.
If you haven’t yet noticed, Net64 is going through a hard time and we, the developers, want to explain what is going on.
If you try to join our partnered Discord server at discord.gg/net64 or visit our subreddit r/Net64 you’ll notice that both of our community platforms have been shutdown.
This was started by our former discord server owner on the 23rd of March when he informed the moderation team and the developers about his plan to leave the server. But instead of resigning and transfering ownership to another person he decided to delete the server. To this day we don’t fully understand his motivation for the shutdown and we weren’t able to convince him of a different solution. Because as the owner he had full control over the server he began shutting down several channels and eventually made a public announcement about the planned deletion on the 31st of March. Shortly after we found ourselves banned from the server and blocked by it’s owner. Users who tried to inform other members about our replacement server got banned.
This seems like a clear indication that said admin just wanted to damage the community as much as possible by abusing his power and our trust. On March 26th he decided to prematurely delete this server as a result of various members sharing the new invite.
We think his actions are disrespectful to the rest of the team as well as to the members of the server. Such a decision should be discussed extensively with the whole team and not be made within one day by a single person because of a bad mood. It could have been a few clicks to just give ownership to someone else. Instead we now have to regroup and form a new community.
If you are still interested in the development of Net64 and its successor you can join our new Discord server here:
We hope you will still follow the project and what we have to show off in the future.
Best Regards,
The Net64 Team