TLDR; It is about the context of the development of Ravioli a work in progress isomorphic library to develop thing like a todolist or a MMORPG.
This is the start of my devlog about my game Wizar and its ecosystem.
Wizar is a MMORPG written in Typescript which intents to be cross "gameplay".
I develop Wizar for years now, almost alone in the coding part and with my wife for the content.
Now that we reach a stable beta version (our versioning does not follow usual naming, beta in video game are usually far more advanced, beta here is like a MVP web app in stable alpha version)
Wizar is born in my mind in 2001. I was a big fan of the FPS Unreal Tournament and fascinated by the STR like Warcraft.
I was (decently good) at UT but a pure lama on Warcraft. I thought and I still think the minions that the player controls have a negative IQ. They just rush to death in a straight line and firing the first encounters.
When you play FPS, this is also the behavior of the new players.
But what if the FPS players take the control of the minions? What if we mix both of those two radically different gameplays to make a new kind of multiplayers game.
This is the goal of the world of Wizar. To connect players on the same world, during the same game session, with different points of view and gameplay: FPS, STR, location based game, quantified self games, ...
Enter the world with a god view in a STR and lead your teams through the battle field. The minions you will lead won't be controlled by AI, but will be real players, which fight on the same battlefield, but in FPS view.
Well... this is the long shot. For now, I am developping a geolocalised version of the game, like WoW, but in the PokemonGo way.
The interesting part is that involves having a common data layer (the world state) and business layer (the world model) and different view layers (the games).
And this is the purpose of Ravioli. A state engine which implements the SAM pattern
The main advantage of this pattern (IMHO) is that imposes a (very) strong decoupling of (for a game but also for a todo list):
- user action
- model mutations
- side effects
Strong separation of the aboves elements can help you to implement:
- isomorphic code (important for games but also to have a reactive web app)
- split the elements across a network (model on server, actions on the client, or UI on the client, actions on servers, etc.)
- componentization(split your app with small components which contents a piece of the model/actions/ui)
I strongly encourage you to take a look at it. And last but not the least, it is very easy to implement without any library. Sure, as your app scale, you will need some helpers even write your own framework. But you will be able to keep it small and with a lot of code reuse.