I wanted to own a piece of a virtual planet. That's pretty much it. I wanted the option to go visit the parts of other planets that my friends had claimed. I wanted to be able to meet up with them on the surface of these planets for a day of exploring. I wanted to meet new friends along the way; maybe they help me with a mission, or maybe I walked them through the beginning stages of gameplay. I wanted to sit in a virtual world and stare out into the abyss knowing that, although the universe is massive, this spot is mine and I am free to share it with whomever I choose.
What has resulted from all of those wants is essentially the culmination of my entire programming career. From many years building complex web application architectures to almost a decade of working in the gaming industry, it has all come down to this one, lonely project. It is some of the most complicated and frustrating work I have ever undertaken, but the sense of reward thus far has been monumental. Yesterday I decided to share my pet project with the world and today I would like to offer up a bit more explanation on what Project Vague is and what it intends to become.
Project Vague is essentially an MMO sandbox game. We give you the sand, you build stuff with it. How you accomplish building your sand castle, and where you build it, and what kind of castle you build, is all up to you. Maybe, like me, you have simple dreams of nothing more than a small planetary station tucked out of sight that you can call home. Or maybe you prefer to group with with a bunch of friends and construct a massive trading station in the middle of an otherwise barren star system. We aren't here to tell you how to play, we are only here to offer you the sand and the toy shovel.
The Vague client is created in Unity which connects to a SmartFox server which then connects to various other servers. SmartFox handles the communication between players, keeps track of where everyone is in relation to everything else, and then hands that data off to the appropriate client; the client then renders that information in such a way that the player can interact with objects and characters; these interactions get sent to the server for authorization, and then sent off to anyone that may need said data.
In the video below, you'll see me eventually park my ship in space with a full view of the nearby planet. If you're curious what I am doing while my ship just floats in space, I am watching for another character to place their structure on the surface of that planet, which you can see at 1:20 in the video (it appears upwards and to the left of the "Distress Beacon" indicator with the title "Mag's Base"). Mag is another character on another account that I am controlling via my Surface Pro, and the base that this character places is exactly the same as the base that my character places at 9:35. Those bases now exist on the server and will always exist for every other player for as long as the player leaves them there, whether or not the owner is logged in or not.
Keep in mind that there is still a lot of work to do; for instance, you'll likely want a door to keep people out of your base. You'll likely want to keep other players from nabbing all of your stuff from the crates you've placed around your base, but you'll also probably want to be able to visit other player's bases freely. This, along with many other features, are on my incredibly long to-do list for this project, and if things continue to progress the way they have recently, these things will be available sooner than I had planned.
Gameplay is essentially pretty simple right now, but the tech running behind the scenes in order to make this all possible is without a doubt the most complicated work I have ever done. Player's each spawn with a ship and have the option to pilot that ship around wherever they want in the current star system; there are no 10km limits here. You can warp to the next system as I write this, but there needs to be a fair amount of work done on the client in order for it to represent the data that is coming in from the server correctly. What is important to me, as the sole developer, is that I can not only visit those other systems, but that when another player follows me into a new system, everything on both of our screens remains in sync; everything is where it belongs even though we have moved >100,000 km in this virtual universe.
After solving floating point precision issues, the next task was to find a way to fill this universe with countless resource deposits without bogging down the server. I will eventually go into the solution to this problem in more detail, but for now suffice it to say that it was not easy and if you see the words "Project Exodus" in the title of any clients, it is because this is the 4th generation of my attempts to pull this off and I opted to use code names for my git repos in order to maintain some semblance of order. The solution to this problem took months of what I can only describe as thought-experiments, followed by months and months of testing these theories until I found the one that worked; in fact, it worked so well that I ended up going back to the drawing board and reworking my entire planet system.
The planet featured in the video is roughly 5km in diameter, providing 80km of surface area for players to explore and has over 21,000 resource deposits dotting its surface. To give you an idea of the scale of the universe that currently resides in my development server, that is 21k resource deposits on a single planet, in a single star system, and there will be a ton of star systems, each with several planets, and recently I have been adding moons which can also be home to deposits and [potentially] player-created structures. Suffice it to say that there will plenty of room to find your own little nook if that's your goal.
All of this work has resulted in what is one of the most fun experiences I have had playing one of my own projects. There is a keen sense of reward that stems from simply running the client on my Surface Pro and my dev machine simultaneously, and then being able to have them interact with one another. Keeping in mind that the following is a fairly old screenshot that contains a lot of UI elements that will no longer be used (since we made the switch from fantasy to space), the screenshot below shows my dev machine running 9 clients, all interacting with each other as well as the tenth client running on my Surface. Granted, my dev machine wasn't too keen on running all these clients at once (especially since I forgot to disable shadows on every one of them), but beyond my dev machine needing a bit of a nap afterwards, things went incredibly well. It is now my goal to get this in the hands of players as soon as I can so that I can share this experience with others.
Project Vague uses a custom Java extension running on SmartFox Server to create the universe and maintain order between players. Behind the scenes of the server is a SQL database that contains all of the data for everything, from items to giant space stations and everything in between. SmartFox and it's MMO API are tasked with keeping track of where each player is, both in relation to objects in the universe as well as other players, and sends out data to whoever is in the vicinity and may need that data. Only the players that need to know where your character has moved to will get said data, and I can even narrow down the list of players who will ultimately get that data based on how far from the player they are; for example, my client may need to know where your character is, but you may be too far away for my client to care about your animation data, so that data doesn't get sent to me. This allows the server to run at optimum efficiency since, in a universe this large, the majority of data that may need to be sent actually doesn't need to be sent anywhere, freeing up critical server resources for distributing what is important.
Alongside the SmartFox server is a web server, complete with a custom made API. This API takes an id number and spits out JSON data for whatever it is you were querying, be that a character, an item, or a star system. This API will be leveraged in the future and may be made public, complete with authorization keys so that the players can make their own apps and what-not for the game. That is by no means a priority at this point, but there is definitely potential there in the future.
Lastly, to help me maintain server-side data, I have created a custom admin software program that has already paid off in spades with regards to how much time it has saved me. I will likely go into more detail on the admin software in my next devlog as this one is already becoming longer than I had intended, but suffice it to say that it takes me only seconds to create a new item, add a list of ingredients so that it can be crafted, and the admin system gives me an estimate of how much that item would be worth in the virtual economy based off the value of the items required to craft it, and it also estimates how long it would take for me to harvest the resources required to craft it (assuming that I was standing on a planet that had deposits for every requirement). Needless to say, the admin program is best saved for it's own article since it is a fairly technical system in and of itself.
What to expect:
If I have piqued your interest then you're probably wondering when you can play, how you can play, etc. The short answer is that you can't play yet and I honestly don't know when you will able to. There aren't exactly example games that I can use as a guide when it comes to developing this game, so in many ways and on many fronts, I am in the dark as much as you are. I had no idea that when I finally found the solution to my resource deposits problem that the solution would allow for me to expand the number of deposits per planet to the large number it is now; I only answered that question through months of work and sleepless nights. That being said, the majority of the "big" stuff is done; the stuff that keeps this thing running smoothly server-side. What needs a major overhaul is the client that is representing the server's information. It lacks polish and players could easily find themselves falling through the planet surface via a glitch or losing their ship after exiting, etc. For the most part, any issues the client encounters can be solved by logging out and back in again; a nuisance, but at least it is a solution. My goal is to solve those problems which the player cannot solve themselves, put some polish on the control mechanics, and then slowly but surely open this game up to the public via our Patreon page. We've removed all tiers and so donations start and end at $1 for the time being, and depending on how many supporters we have when I'm ready for live testing, then you may very well be one of the first people to get your hands on the client for the price of a candy bar.
I will write some very technical articles in the future to showcase the amounts of data being exchanged, provide screenshots of server-side graphs, as well as a glimpse into how things run behind the scenes - but also keep in mind that several of the solutions to the problems I faced in creating this project are my own intellectual property and it will likely be quite some time before I am in a position where I feel comfortable sharing those solutions. I did not work for almost 30 years to simply give away what is essentially the culmination of my life's work, but I promise I will try and give you enough information to hold your interest.
Thank you for taking the time to check out our game. I have provided links below to our Patreon page and our subreddit, both of which I will try to keep up-to-date. They are both very new and I will absolutely need to go through and tidy them (and this page) up in the near future, but at least they exist now.