After spending weeks playing games ( such as Metro 2033 LL ) and doing some gaming-unrelated projects I stumbled upon this fancy animation...
Instead of working on building placement and things like that, I thought what if I dived into multi-threading. So I re-installed SupCom series and Spring RTS and checked some of their internal functions out, then I read more boring ( and sometimes interesting ) stuff about mutlithreading and finally thought to myself “I should probable keep it single threaded to begin with”.
Anyhow, knowledge was gained and time was wasted without any real gameplay progress, only one thing changed : I can now regulate the game speed and have this sweet slow motion effect, guess that’s something =P
Working pathfinding ! This time better it’s than the previous version. I still decided to stick to my half-arsed flow field implementation because apparently it seems that even StarCraft 2 uses it ( maybe it has a mix of different techniques )
Either way, it seems to be working fine and units seem to get around anywhere without too much problems.
Time to work on building placement =)
Finally, deterministic movement finished !
Life sucks when NET doesn’t offer the possibility to set a IEEE 754 standard which makes most of your determinism problems disappear. You have to struggle implementing some retarded fixed point math and do some ugly stuff all over your clean project. Anyhow, this time my game won’t suffer from desync issues as it did previously in my legacy version.
So you’ve made a game and it turns out to be a great idea but has some small annoyances or badly tweaked gameplay mechanics.
What do you do then?
The most common option would be to constantly release updates and hope that everyone remains happy. Unfortunately, not everyone shares the same opinions about the gameplay mechanics. Tweaking one thing will break another player’s experience. Balancing the whole game is one hell of a hard task. Most importantly, balance issues can break the whole game; giving advantage to some and not others will make you lose your players pretty fast ( Blizzard actually spent a year correcting the balance in Starcraft 2 even when the game was done ). Anyhow, balancing is one of the most important aspects and it is pretty damn hard to manage, especially in strategy games.
The less obvious option of keeping everyone happy would be to allow users to modify the game themselves, basically allowing them to create mods for the game. Balancing, gameplay tweaking and improvements can be done by the community itself ! There are probably a lot more experienced people in this world who are better at balancing the gameplay than you, and if you allow them to fix it up, they will do it. By allowing modding, they will create their own versions of the game that fit their needs and expectations, increasing replayability and making everyone happy.
It’s the reason why I chose to make my own engine. The secondary goal of my project is to provide an highly customizable RTS engine that anyone could use to create their own strategy games.
A good selection system is extremely important for RTS games, a good strategy game will allow the player to select their units and buildings in many different ways.
Most basic strategy games should at least have a simple rectangle selection tool, and maybe some custom selection tools as well such as the one in SupCom 2 which allows paint-mode selection and even though I’ve never really tried it I’m pretty sure it can be pretty handy in certain occasions. Other selection methods in RTS games can be also helpful : setting groups, smart selection ( like in KKND ), selection by path, any sort of additional way of managing the game’s objects is always welcome, as long as they don’t replace the basic ones.
Now, I’ve seen some indie strategy games which actually only had that basic rectangle selection tool but lacked the real features like adding or removing objects from your selection, those small but significant things are what differentiates a good strategy game from a mediocre one.
Any sort of strategy game should have at least these features :
Here’s a demonstration of the “good” basic rectangle selection system…
Obviously selects everything that interacts with the box
We do the same thing while holding ALT
And BAM! all those units inside that selection were deselected.
If you hold SHIFT, you should be able to add units to the group.
Finally, the double click selection ( ignore the ugly bodyless units )
Which selects all units of the same type that are visible on the screen
It’s simple as that !
Smart selection is also an important thing to have if your game has a lot of different selectable objects next to each other. When you have few units next to a base and you select all of them, there’s a high chance that you don’t want the base to be included in your selection, smart selection filters out the improbable selection and makes your life easier.
Strategy games need to allow players to have different methods of selecting their units, ability to select however you want is really important, like customizable shortcuts that select certain groups of units.
The more freedom of management you have, the better it is. Realize that not everyone plays the same way as you do, think about all those crazy micro-management Koreans !
Although I did write at some point that making an engine and a game at the same time can be a challenge, but if you add something such as a RTS gameplay using various experimental techniques that you see mostly in recent games it will definitely result in BOTTLENECKS.
Especially when you’re the only one developer.
The solution is to actually avoid looking too far into the future, it’s true that I’m not going to be able to replicate Unreal Engine 4 tech nor have my game directly explode like Minecraft did due to my engine’s platform limitations. However, I can start with something simple, finish it and then develop and advance this technology.
The biggest bottleneck for my project is the fact that I chose to create an engine along with it instead of using an existing one, it’s not exactly something simple but thanks to it I learned a hell lot of things and my knowledge was overfilled with all those little secrets and techniques. Now that I’ve already have something in place, a custom and personal engine made and optimized just for this game, it seems a little bit pointless to use another one, especially when there are no good free engines that specialize in RTS genre ( not counting SpringRTS ).
People who aren’t exactly familiar with the networking techniques will think that in a multiplayer game, the server will always be the one sending all the world information to every single player all the time, even though it ensures that every one sees the world the same way as others, it’s not always the best solution. Instead of sending every 20 millisecond the states of the enemy AI from the server to clients, we can simply send the action to perform and then simulate the same behavior across the clients and make them behave in the same exact way everywhere, saving us a hell lot of data to transfer which we can use for more important stuff. For certain types of games such as FPS ones, it’s acceptable if some things aren’t simulated in the same way across all machines but for RTS games, synchronizing the gameplay is THE most important thing.
The first problem with my game was the fact that I underestimated the determinism, I thought “hey, I could simply make some fancy pathfinding and replicate it across clients” but I soon discovered that a floating point can be a bitch and small differences were noticeable while doing network tests, ultimately ending up with desynchronized games.
The problem with floating points is that you don’t exactly have the same result on all machines ( if you’re interested for more details, here’s a nice A-to-Z article on floats : http://randomascii.wordpress.com/2013/02/07/float-precision-revisited-nine-digit-float-portability/ ) but in some languages such as C++, you have the possibility of forcing the machine to use a certain standard, allowing the floats to have same results across all platforms. Unfortunately in C#, you do not have this option.
I didn’t expect the lack of such thing and this had caused me some problems because most of my game’s logic was already heavily based on floats. AI wars’ developer Christopher M. Park encountered the same kind of problem for his game and he managed to create a fixed point class that would be used like deterministic floats, resolving his problems once and for all. ( http://stackoverflow.com/a/616015 )
My new goal for the new build of FationCommand would be avoiding the floats and using integers or fixed point values instead.