Design Diary – December 2023
Hello and happy holiday season, everyone! I figured I could sneak one blog post in 2023 and pretend I’ve been keeping up with it all along. It’s been my one area of neglect on this digital board game journey, but I’ve been busily working on Arete: The Battles of Alexander the Great since the last update.
First, a note about social media: Since November of last year, my Twitter feed has been saturated with hate speech, spam, and misinformation. “Blue check” accounts are elevated and sifting through them to find the buried tweets of those I care about is a chore. Consequently, I’m far less active there and the only reason I haven’t deleted the account entirely is because some great people from the wargaming community still use it. I hope you’ll consider joining me at one or more of the alternatives: Bluesky, Mastodon, Facebook, Facebook Wargames group, and Facebook Wargame Design group. If you find any of those confusing and need help or if you need an invite code for Bluesky, please don’t hesitate to contact me.
Now onto the good stuff. There have been lots of changes since last time. Here are some of the biggest ones:
Online Multiplayer
This was out of nowhere. I originally planned this to just be a single player game, possibly with pass-and-play, but entirely offline. At some point early in the year, I started wondering, “If I was going to add multiplayer as well, how would I do it?” and my investigations to see if I could do it turned into, “Well now I might as well do it.” It took a few months to construct and I had to handle a way to pass the states of the game with all its counters and its ever-growing history, but I managed to piece it together.
From a technical standpoint, I looked at saving all game states, whether by sending the whole collection or by assembling it on the server, but this just gets too big. Instead I devised a way to save a much-abbreviated history within the game object that gets sent back and forth. If you’re in the game and waiting for your opponent, the app will then play back what they did, recreating it. If not, you’ll just see the latest state when you log back into the game. The down side of this is that you can’t “rewind” like you can in Vassal or Rally-the-Troops, but to get a working online game that doesn’t slow down as it progresses, I’ll take it for now.
Adding online meant I had to add a lot of accompanying elements such as a login system, an ability to save games somewhere, and the user interface to name a few. It was a long process and one that I’m still not completely done tweaking.
AI Enhancements
Disclaimer: When I talk about AI, I’m talking about enemy behavior that’s always been around in video games. Generative AI, which copies and manipulates patterns found in other creators’ work, is something else entirely. There’s much debate going on about the ethics of how developers of generative AI collect sources. I stand firmly with artists and other creators in demanding all creator work be protected from use without permission. Needless to say all the art, text, and code in my game has been created by me. Now onto game AI…
The simplest enemy AI behavior is something like, “Go towards the player character and attack.” Having multiple enemies converging on your lone character is good chaotic fun. If you’ve ever played the video game classics, Berzerk, Robotron: 2084, or Smash TV you know what I mean. If you’ve ever gotten the puck while playing hockey in grade school gym class and been swarmed by every kid on the other team, you’ve experienced an unintentional analog version of this.
Obviously that behavior doesn’t work so well when trying to recreate historic battles with armies of multiple targets and orders, because all enemies converging on the closest counter isn’t very effective or realistic. I added a list of behaviors that could be applied to each counter (attack, defend, etc.) and that took me part of the way there, but it still needed something.
I wanted the flexibility of having one group doing one thing, while another does something else. For example, one group might react to an enemy that just moved into range, while another adjacent group maintains their original behavior (standing their ground for example), so I added this idea of groups. This allows the AI the ability to coordinate, not only on the counter level, but also at a group level and it avoids the swarming AI as described above. I made a video that explains this in more detail.
Additionally, I now have the ability to test a scenario multiple times with animations off. An indirect benefit that players will never see, being able to run through a battle 10 times in a matter of minutes has helped me immeasurably in balancing the scenarios, observing AI behaviors, and catching bugs.
Campaign Mode!
Once I finished the fourth battle of the game, I thought it was time to add a campaign feature that links all the battles together. It gives the player a better understanding of how Alexander’s army moved across his would-be empire and gives the game more purpose, a “bigger than one battle” feeling. At the time of this writing I’m still undecided as to how I will grade a player’s performance, but the game is saving stats on each battle as they progress so anything’s possible.
More Scenarios
At the time of this writing I’m working on the sixth battle that will be included in the game. I’m not sure if I’ll stop after six or keep adding battles. Along the way I’ve tried to make art improvements to both, the counters and maps.
Reinforcements
I added this feature last year and wasn’t even sure if it would make its way into the game, but I knew it might come in handy at some point. Especially if I were to make more games using this system…
Ahem. Well it turns out I did have use for it in the Hydaspes scenario where some units were getting to the party late so it worked out well. There were some interesting challenges in having these units being placed mid-battle. For example, when the reinforcement’s entry hex and its adjacent hexes are occupied. In that case I made the decision that a counter could enter into contiguous adjacent hexes up to its movement value. If all hexes are occupied that unit will have to wait to enter the fray.
Much, Much More
Other than these major changes there were many smaller ones. Adding online and campaign modes means adding more screens and more UI elements. I had originally said I was going to be done with this game at the start of last year (lolz) but I decided it’s more important to get some things right on launch than adding them later, additional battles, online, and campaign being the biggest culprits.
There’s still a lot to do but I’m optimistically hoping I can release this game in 2024. Thanks for reading and happy gaming!
Fabulous work. Couple of questions,
1. Do you have a database – I’m starting wargame project using Django.
2. What is your front-end – I’m using the brand-new Pyscript/LTK in the browser.
3. How are you handling zoom and pan.
4. Do you have a github.
Hi there Mark, I do have a database but it’s only needed for online play. So far, I’m not using any frameworks or libraries at all. Everything is coded from scratch. I’m not against frameworks or anything, just personally more comfortable doing as much as I can without and relying on my front-end experience.