Untitled Tactics Project - Devtober 2022 Postmortem
Hello there. I participated in the Devtober 2022 jam while I was starting a project in Godot, a tactics-like game prototype, as an experiment in pathfinding and then A.I. I wrote a postmortem on the public build page. Here’s the content of the postmortem rewritten here.
Hello. This is it, October is almost done and I am writing this small
postmortem to sum up what went through this month, even if it went faster than
expected.
0 - Some context, before and during the jam
I was mostly in the process of learning how to use Godot in a bigger project and instead of trying to emulate once more the same game among my favorite ones, I tried instead to bring back an old project idea, which also involved gameplay mimicry, this time with tactics games like Final Fantasy Tactics Advance.
The project started mid-September, mostly as an experiment in handmade pathfinding in a 3D tiled map, the git repo is still named “TacticsMapPathfinding” after all. According to the commit logs, Devtober kicked in when I was done with pathfinding and was playing around while making GUI code to display placeholder values in hope it could help me get motivated to work on stat systems or AI.
Here’s a basic list of the tasks done during October:
- Polishing the current GUI theme
- Getting the attack system working (stat, range, name) and with animations
- Extending the GUI (entity panel or turn queue display) and in-game visual elements (like the current entity marker)
- Getting the turn-based gameplay flow with some of the states listed here:
- Turn selection
- Target selection
- Attack action/move action
- Waiting for target K.O.
- Adding teams
- And more importantly, a first version of the AI, which was, after all, the main goal of this jam.
1 - What went well
I think most of the pre-requisite tasks for implementing the A.I. were the “funniest” part of the month. Getting the foundation properly set to embed a brain in a playable character was both fun and routine,. Getting turns to work or a basic version of attack-defense stats aren’t the most exciting jobs, they still provide your dopamine kick when things are set and working as expected.
Learning about bigger scale in Godot also didn’t go too bad, I did work a bit on a smaller project before attention-hopping to this one and I was excited to learn a bit of the 3D side, even if it’d mostly be isometric.
Even the A.I. bit had a few good points: it’s one of the tasks I usually get a brain block, something that just empties me of motivation and energy as soon as I’m facing it (physics/collisions are my other kryptonite). Here, while I still spent some time at the start beating around the bush, I finally got to jump on it as soon as I got a vague intuition on how I’d do it, being vaguely inspired from older solution search algorithms like min-max with board scoring.
On a more personal side, I’m mostly happy with how I could “almost” get a regular streak for the month, I know I’m a bit lazy when it comes to hobbies and I can get dragged into something totally unrelated and it’d pull all my attention and motivation away. Keeping up the trend was a tough challenge as the jam went on, but except the break around the end of the month, I more or less got to work every day, so yay.
2 - What went wrong
I have in mind two specific bits : attention span and programming A.I., or more generally, my lack of planning. There is actually a third one but it was “actually getting sick for a day”, so nevermind.
My attention span during the time I allocated myself for the task wasn’t 100% on working on the project, as I hoped I’d be. That’s honestly quite a high bar to put oneself like me to and I failed on this one. I had something like 2 to 4 hours per day for the jam, give or take the chores or going out or work events, and there were a few days where I just did a token improvement and called it a day. I know it’s a jam about getting onself into a comfortable rhythm of work and avoiding pressure at any cost, but sometimes you have to kick yourself in the butt if you’re not content with looking around for any kind of distraction.
The other one is as I sad, the general lack of planning or how it bit me in the back while working on the A.I. Basically I kept some gameplay ideas in a notebook and just rolled with that. I have almost zero experience in game design and I still don’t know how to plan gameplay stuff like statistics. I had an “intuition” on how I could work on A.I. based on an old project with a friend where he worked on the A.I. for a board game and I got some theory lessons out of that, but other than that, nothing other than stubbornness and luck.
The plan was to make an action tree search to determine the best course of action for a turn based on the situation of the board between each step of the turn, evaluating between each step. It sounded great, flexible, forward-thought! Turned out it was a major case of over-engineering. Here’s a few points on that:
-
First, to get a first version working, you don’t really need intermediate evaluation/board scoring. Sure, it could help you prune the tree out of non-worthy branches, but if your A.I. is not planning multiple turns ahead and if the width of the tree is not that big, there’s little sense into adding this extra complexity.
-
Board evaluation is extra finicky to get working. How do you express that moving to a target and then attacking when you’re in range is a more viable course than jumping off the cliff? I had issues wording some of the abstract ideas I had into code and it showed specially on the board evaluation. I thought that evaluating a tile based on multiple “field” factors like enemy proximity or damage potential could work, but I think I also jumped right ahead something that would over-complexify the code and planned things that didn’t end up used in a first version.
-
That one is a bit more on the code itself : I had a hard time revolving myself around taking a different appraoch and it made splicing the code harder. I couldn’t resolve myself to throw the code away and I ended up fixing the major pain points by reworking a whole algorithm on a side before slowly replacing it. By itself, it’s not really a bad thing, that’s usually how I expect slow migrations to happen in codebases, but here I was in the middle of trying to not drop the project out of frustration because the broken A.I. code reflected the usual mistakes of planning stuff I ended up not using and getting stuck with badly written code that fails to reflect fully my train of thoughts. I got lucky because rewriting the tree browsing and pushing the evaluation to leaf nodes cleared everything up. At least I didn’t directly go to experiment with stuff like behavior trees, where I still fail to conceptualize how I could use them (been there, done that in a past project).
3 - How to improve that
That will probably a hard part to write. Honestly? My objectives were rather limited and barring the usual “stay focused”, “try planning less far ahead” or “write code you can throw more easier”, I don’t really know what I could write in this section, sorry.
4 - The lessons at the end of the story
I usually say I’m mostly lazy with personal projects but Devtober showed me I could eventually get my arse working on a project for more than two weeks, even if it’s for an extrinsic satisfaction. It was a challenge and I got most of it beaten, so yay.
I got one (1) kind of A.I. behavior working, which was my goal. Maybe it was a bit low but it showed me a way that may be viable for more of them (healer? Attacks with weird ranges? etc. etc.). The biggest lesson I’d say from my experiment was to not delve into tree pruning before getting at least some viable results.
Other than that, I discovered I liked making the VFX for the attacks, those two were fun to make, I wonder if I can do more of them without becoming repetitive to watch. Maybe it was too fun sometimes and got me full workdays slots of doodling around but still..
5 - Closing words?
I don’t know how to finish that postmortem, I don’t even know if that was a proper one. I think mostly looking the commit log, remembering how I preferred spending time working on the project than playing or working on something else is somewhat gratifying, I still have the spark to work on something that is on a bigger scope than the usual Pico-8 doodle, and it’s cool!
I’d like to push this project further but I already am thinking of joining another game jam, this time the LSDJam 2022, which would mostly pushes me to either redo part of the theming and the game to fall into the jam or work on yet another project - oh no!