Bushi
At a Glance
Summary

Bushi is a 3rd person arena brawler with heavy emphasis on mobility and rock paper scissors style combat. With only a small team of five people and no funding, we developed a near AAA title quality experience in a little over three years. This project pushed me beyond my limits, stretching my leadership, project management, and coding skills exponentially. Managing a small team to maximize their productivity, keeping our scope tight to meet deadlines, and balancing time with necessity has been an invaluable experience for me. Having launched such an ambitious title and generating revenue working with the bare minimum has given me the confidence to move forward with any project and carry it to success.

Details

A couple art friends of mine came to me with the idea for Bushi in early 2020. The core concepts of Bushi were heavily inspired by Gunz the Duel, an early 2000s cult classic and a Dota 2 custom game called Hardcore Ninja. The main mechanics include wall running / jumping, a two-directional dodge, an omni-directional dash attack, a bow and arrow attack, a sword melee attack, and a parry that reflects damage. Because the game is so fast with so much instantaneous movement, networking replication was a major challenge. We were unable to launch the game on Steam and had no money to host dedicated servers. With no viable alternatives available, we had to build a NAT punch through server and networking system so that players would be able to connect with each other. Despite these hurdles we were able to produce a seamless experience even with ping up to 300!

Networking Infrastructure

NAT punch through has been an industry standard for many years, however the documentation and resources about it are scarce and undetailed. I had to do a lot of digging and theory crafting to get started. This type of work requires a deep understanding of networking, sockets, and packet handling. First, I had to create a server to receive and relay game information, typically referred to as a master server. I created this server using NodeJS / typescript. Once I had a master server that could receive and send custom UDP packets, I had to use low level C++ to create a socket that could receive and send UDP packets from the game client. After the communication between the game and the master server was established, it was time to start implementing the NAT punch through process. Simply put, a client hosting a game needs to record its information on the master server, another client wanting to join that server tells the master server that it wants to join. The master server sends the client and the host server one another’s information. The clients then send each other packets to open a connection. This process, however, does not work for everyone. So, I also implemented Upnp and Pcp protocols. There are protocols that allow a device to request port forwarding on the network’s router automatically. With these three techniques combined, I was able to create a stable medium for players to connect with each other.