Me neither.
The new build has bug fixes and a resized hat, huzzaa!
MiniLD #72 | Ludum Dare 37 | Ludum Dare 36 | Ludum Dare 35 |
Ludum Dare 34 | October Challenge 2015 | Ludum Dare 33 | Ludum Dare 32 |
Ludum Dare 30 | Ludum Dare 29 | Ludum Dare 28 | Ludum Dare 26 |
![]() W.R.L.D. Champion! (LD38) Awarded by TerraCottaFrog on June 1, 2017 |
Global highscores are in, the build is optimized and, so far, the bugs have been fixed!
There’s still time to partake in the Elympics.
The prior two LD jams in the past year I worked in a duo; but this time, once again, I went in solo. It turned out pretty well, even though I only managed to squeeze 30 effective work hours into the time frame due to a hectic upcoming week. That week is now long gone so it is time for some reflection.
The day before the jam I got an idea based on a vision I had quite some time ago. Basically tactical squad management with robots that fall from the skies. The mechanical inspiration came from Atom Zombie Smasher (an old favorite) and the thematic inspiration from MGS5, which I’ve been playing for the last two months at this point (it is quite good, even if Kojima constantly tries to foil it with inane supernatural elements!)
I knew that I couldn’t spend as much time on the project as usual so I laid down a simple, yet effective plan: programming first, critical graphics next, level design/tutorial third, and nice to have features if there’s any time left. Well, there wasn’t so audio among other things was cut.
Surprisingly smooth going overall. More work on graphical assets would have been nice as the levels are just made out of simple shapes, but at least they are functional. Coming up with the name was about the toughest job in all and even then the outcome exceeded my expectations (51 letter is pretty good right?)
Fun jam! With more time the outcome could have been even better, but that happens. I did release two bug fix versions and I’d like to release a proper post-jam version after the holidays are over.
Have a restful rest of the year.
That name! Long, but apt.
Had a good time making it. I think there’s potential here, but the next few weeks are no good for me so don’t hold any hope of a quick post-jam version. Oh well.
This is pretty much it. Even the humans got themselves a model, albeit sans animations.
There’s a lot more I’d like to add, but unfortunately it is going to be a busy next week for me. If only I could take Monday off, but alas.
Surely a few more hours won’t hurt too much, right?
Tacticool sheep extraction team?
Hmm, I’ll continue working on the name.
I’ve kept my priorities in check. Simulation first, then critical graphics assets and thirdly all the levels. Now it is time for polish and nice to have features!
Jumped on the graphics implementation already. Some of you might spot the inspiration.
Requires texturing, but otherwise I’m quite happy with it. I might even reuse it for the enemies, if I don’t feel like modeling a human tomorrow.
Enough for the day.
All the systems are more or less done (according to plan). Tweaking and polish are of course needed.
Plenty of time for graphics tomorrow, it seems.
My tactical extraction action simulation is coming along nicely (I’ll need to think of a snappier name at some point!).
The red cube obviously represents a human guard with a gun, while the green cube is a player controlled robot. The plan is to have three different kinds of robots who have to work together to extract resources and people from the level. Lots of features to implement.
Flying solo again so we’ll see if there’s any time for graphics.
Took a while (too many projects at the moment; loving it!), but here it is: Part 2. The basis of the system is still a reactive AI using heuristics. It doesn’t plan ahead at all, which is good enough even if it does show every once in a while.
The full AI code can be found here, if you care for that sort of thing!
Heatmap, the main technique utilized, simply stores values in an extra tilemap (int array!) for spatial information evaluation. In this case the heatmap stores threat and support values used in choosing the AI attack target and movement path.
Heatmap visualization
The recursive heatmap function is called for each enemy and ally on the map
Calculating the threat (and support) values is a cinch: Add up the probable averages of all usable weapon types of your allies and enemies. There is a bit of quess work involved if the enemy ammo counts are not known already.
Nothing out of ordinary here I’d hope
New feature alert! Taken that we already have threat values for each group and location data about safe areas, we might as well have a bit of fun with them! Every time a group gets into a fight its support value is compared to the threat level around it. A high enough difference will send the group in panic, running away from enemies and finally fleeing if reaching the level border. Now you can bully your enemies to submission!
Panic also ensues if the total enemy force is overwhelming, but that is checked elsewhere
Simple and seems to work alright. In the next project I’ll be using Monte Carlo Tree Search, no doubt about that. It is much less work with potentially more intelligent results. Working on a generic version at the moment.
PS:
seththefirst suggested taking a look into AI utility functions in part 1 . The threat level comparison turned out to be sufficient so I didn’t implement anything like it, but maybe you (yes, you!) will find it useful.
Missed the voting period slightly. Not that it matters much, deadlines were made to be broken.
Bug fixes, AI improvements and usability tweaks ahoy! Also added in a new feature: morale. Troops in a tough stop will panic and scatter for that extra layer of reelism!
Will do an extended AI write up soon’ish.
Quite the shocker that!
Had some spare time to sink into the post jam version this past week. Implementing the battle visuals was a blast! Got animation assets from a mysterious fellow member of the secret society! The less said about that the better.
Part 2 will be about AI improvements and more tweaks (I forgot a few!).
or
TL:DR KISS
The Post-Jam version is still far away (I’ve hardly had any time to work on it yet) so I might as well talk about the AI of the Jam version and the plan for the Post-Jam AI.
The first version of the AI was finished in the morning of the second day. It had one goal and one goal only, EXTERMINATE! In simple terms each unit finds the closest enemy and moves towards it. They also check that the path to the enemy is not blocked, by simply finding a path to it. This could cause slowdown with bigger maps and larger unit counts, but here it is just fine and dandy.
VIEW CODE (embedding doesn’t work unfortunately…)
So far the AI doesn’t take into consideration the main mechanic: scavenging technology. Implementing such behaviour, the quick and easy way, requires nothing more than adding technology distance checking into the previous code. If there’s technology closer to the unit than enemies, then that is what the unit will go for. On top of this the unit won’t move until it has completely excavated the technology.
I could have stopped here, but there was an annoying deficiency in the artificial thought process. The units don’t prioritize actions; In other words, an attacking unit is sometimes blocked by a scavenging unit.
The fix is slightly more elaborate than the previous step, but by no means complicated: tally up the best actions from all units and choose the most important one based on the target type and distance. Here’s the final AI in action.
There are still a few things I’d like to implement in the AI, namely threat assessment and intelligent positioning. As luck would have it, there’s a single technique which can be used to achieve both of these goals: heatmaps! A heatmap is simply an extra tilemap which contains values based on unit proximity and threat level (if you are lazy you can even reuse the world tilemap objects for this purpose). Heatmaps can be used in selecting the target (lower threat value is preferred) and in pathfinding to choose the safest route to the target.
Keep it simple and you’ll go surprisingly far.