One of my favorite games of all time is Master of Orion II. It is a game that I find myself playing throughout the years. The game is very replayable and especially after a few mods fixed some of the issues in gameplay and some bugs, the game is better than ever.
One recurrent thought that I have as I play MOO2 is could I do this better? Or I wonder how they did do this.
So I took this MOO2 itch and mixed it with my itch to program new stuff and I went at it: I am remaking MOO2 using new technologies, with a good mix of what I already know how to do and things that I am learning.
How far I will go I don't know. In a way it does not matter at all. It's the journey that matters, it's the steps taken that are fun, not so much the end result. Although the end result here could potentially be as much fun as the original. Wishful thinking, I know, but a goal worth pursuing.
The Architecture
For the frontend I went back and forth with a couple of options. I considered using PhaserJS but I wanted to focus my attention on an interesting backend first, which meant that the frontend would need to be a boring one.
Of course, this is going to be a web game.
Frontend
I went with Angular for the UI, and simple SVGs for the graphics. That way I can have my fun playing with Inkscape and not worry too much about the programming itself.
The web UI will have the ability to connect to a particular game server, browse created games, create new games, and even switch between games in the same session. Ambitious, but I have a clear path in my mind.
Another thing I may try is NgRx, because I need to manage a huge state and I've never used it in a bigger project.
Backend
I considered Elixir, Go and Node. I still don't feel that comfortable with Elixir and balancing the know-how/learn-how tipped the scale in favor of Go this time.
It will offer an API to host a variety of multiplayer games, including a websocket to push game updates. Since the game is turn-based I expect the network usage to be manageable.
In the future I will probably have to include some kind of logic to make sure I only send that which has changed. Or maybe even try Elixir's LiveView!
To begin with I will keep it simple. Everyone will be able to see everyone else's state in the updates. No security by default. I'm sure this will not be a huge problem down the line.