Making Warlock's Gambit

Warlock’s Gambit is our submission to the first Bevy game jam. It was made over 7 days by Team Plover. This dev log is a rundown of the development process. Will dive into the nitty-gritty code implementation details in a future dev log.

The Team

Team Plover had 7 members but most of the work was done by 4 of them. The participation of the 3 other members was still welcome and helped finish the game in time.

I’m one of the two developers who put serious work into Warlock’s Gambit. I’ve programmed all the logic, while vasukas made sure my code ran on all plateforms and implemented the win/lose states. Which is not chump change! It was an invaluable contribution.

Team Plover is extremely distributed, with at least 4 continents accounted for. This was already a challenge in itself. The channels most people use for consensus are not available to a distributed team.

The Setup

We decided pretty quickly to work using git on Github. The game would be in a private repo until the release, when we would open-source it. The competition rules allowed to start from a “generic” project. I decided to setup a project with probably-useful dependencies and write a minimal starting menu with audio sliders (turns out we have the only game in the comp with audio sliders.)

The Idea

Once the jam theme was announced, we discussed what we could do based on “Unfair Advantage” in Discord on text channels. I personally wanted something involving pigeons or wizards or both at the same time, imagining a game of soccer with wizards. However, the idea that caught everyone’s imagination was Lorithan’s card game: you play against someone who stacked the deck against you. The only way to win would be by cheating.

Once we had the idea. I put it down on a markdown file on git with a very basic draft of game design. Github has a surprisingly usable markdown editor that let you edit text files and update them in the browser. With this, I encouraged everyone, including our artists with no concept of programming to edit the design file with their comments and design suggestions. However that file didn’t see a lot of edits and the game design lingered.

The Design

It was convened that we should have a voice chat where we could discuss synchronously the game design to acquire a consensus before going forward with code or art. We spent a day and an half picking up everyone’s schedule and trying to find a time frame during which we could get all together. This failed as we were really distributed and simply didn’t have overlapping free time to get together.

After having spent two days waiting on something that didn’t happen, we implicitly decided on going forward with the design. I improved the design by adding more details. Once we were ready, we went at it like a canon ball. This is where development really took off.

The Code

This means we only had about 4 days left to write the code and get something out the door. I still can’t believe I managed to make such a high polish game in such short notice. This is contrary to everything I’ve done before. I think the team was the real catalyst for that productivity. I was already very familiar with rust and was coming from 5 months of full time focus on bevy game making. I knew the ins and out of the engine, what were the areas to avoid and how to use optimally bevy’s feature to make a great game. But I never reached such an intense coding output before. I’ll go into the coding details in a future dev log.

The Art

Xo has been working with me for the same length of time I’ve been discovering bevy. He’s an excellent artist, it’s in fact an honor to be able to work with such a talented person. Xo mocked a scene (the one you can see in the game) and produced the assets as separate 2d png files. I specifically asked him for this, so that I could put them together in a 3d scene in blender, in addition to various “empty” objects that would serve an anchor for gameplay elements. I’ll go in more details how I linked the gameplay elements to the objects in a future post. You can find that scene in the game files. You can open it with blender to see for yourself how it looks like 🙂

I spent a few hours adjusting the graphical assets, not only in the 3d scene, but also the card assets. To reduce file size, I converted the card numbers and words to a 2d color palette. The PNG file format can efficiently compress low color count images with simple shapes. This involved a lot of looking up on stack overflow how to use the imageMagick convert tool. But we got everything in the correct format by the end.

Samuel_Sound was a late-comer to the party, and worked completely independently of the rest of the team, just asking for a mood and some inspirations. But their contribution was paramount to give a personality to the game. The music they produced is excellent. They worked off of The Banished soundtrack. Samuel_Sound also contributed the card shuffling sounds.

The “words of power” that gives effect to cards are written in Enochian. The voice you can hear when they are played is mine. I say the word as they would be pronounced in Enochian. I modified the voice with Audacity effects. I also made squawking and quacking noises for the bird, sadly I couldn’t add those sfx in time.

The Final Rush

The final day was insane! Up until Friday, we really didn’t have any playable “game”. Just card drawing, dragging, dropping and basic War score counting. But it came together very quickly! I calculated I could get a publishable game with sound, music, card effects and win/lose by midday (while the submission was at 10PM). And I wasn’t far off. By 3PM I implemented that day:

I took the rest of the afternoon to design a sequence of cards that makes it impossible to win without cheating while being beatable with the sleeve trick. This involved pen and paper and a calculator. It was very fun to design. This prompted me to add synergies to the card effects. Surprisingly, designing the deck with synergies in mind (for example, the +12 and x2 would double the bonus) was much easier.

By 6:30PM I added the deck to the game. It was time to publish the game on itch.io. This is where vasukas’s and BLucky’s contributions were the most critical. I developed the game on Linux with absolutely no regard for multiplatform. While I was hammering at the code, vasukas was figuring out how to create an HTML file with the game embedded. BLucky compiled the binary for MacOS. I was hopping that the official bevy Github CI pipeline would be enough, but it was too dang slow, the MacOS build failed and the wasm version didn’t even work! Each team member pushed their version of the game to the itch.io page and by the end we had everything in order. I even had the time to add the deck shrinking mechanic.

That’s it. I’m really proud of the result. I do think we have the most polished entry in the jam by a large margin, despite all the bugs. I’m myself extremely surprised I could write so quickly such a game. And I’m surprised the game ended up actually quite fun despite having about 3 hours of thought put into it.

Now I know you are a bevy users and you are highly disappointed I didn’t go into details about game architecture, ecs, events and all the implementation details. But don’t be despondent! I love writing about technical things and as I said I’m very proud of the code, so obviously I’ll go into a deep dive in a future dev log entry. Be patient 😉