Bevy Jam #1 Postmortem: The First Game Jam Experience


Hello! Now that Bevy Jam #1 has ended, I'd like to talk about my experience with creating this game a little.

So, let's start with some qualifications - or rather, my lack thereof. This is pretty much my first ever game jam - not only that, this is my first ever game that I've published publicly, and my first time using the Bevy engine. I've tried making games before, but they were usually small projects that never really went anywhere, ones that I just shared with my friends. The only two game engines I remember using before this was Game Maker Studio 1 and LÖVE.

This won't be a very detailed devlog with professional tips sprinkled about - this is more to simply chronicle my journey across this game jam, and summarize all the things I've learned at the very end. Regardless, I hope this perspective from someone completely new to a lot of these things are educational to someone!

With all that aside, let's get to it!

Pre-Beginning: Ideas, Preparations, Learning the Engine

Honestly, it's been a good while since I touched rust as a programming language at all. I've been looking for an excuse to use it because it's a language I really like, but I just didn't know what to make with it.

And then, by luck, I found out about the Bevy Jam. I knew of Bevy before this, but since I saw that it was still in beta, it was something I chose to avoid - but this gave me the perfect excuse to get into it. So, I signed up, and joined the discord for some intel on the game theme.

I spent most of the one week before the jam actually learning the basics of the engine - how to spawn a window, how to show sprites on the screen, so on so forth. This wasn't very interesting, so I won't go into details over it, but I managed to make half of a Swing Copters clone, so I suppose that's something.

Other than that, I was keeping an eye on the jam theme voting. Third place sort of went back and forth, but the top two were very solidly there - Unfair Advantage and Changing Rules. I tried thinking of a game idea for both of those themes for a bit, but in the end, I didn't come up with anything solid until the final theme was decided - and it turned out to be Unfair Advantage.

Okay, so we have the theme. What's the game I'm going to make?

I spent some time bouncing ideas back and forth with some of my friends. Actually, the initial idea we came up with was completely unrelated to the game you see here - it was going to be a roguelite deckbuilder that starts off normal enough, but as you build your deck, it becomes very obvious very quickly that the AI is deliberately building to counter your deck, as if it knows what you're picking. In the end though, that idea was scrapped for one simple reason:

There was no way I could code that sort of adaptive AI while learning all of Bevy at the same time.

So, that idea was out. Now what?

It was at this moment that I remembered an old game idea we juggled back and forth a few months back. It was a game where you played as a very powerful lich in the middle of a long reign, who is forced to feed on the armies that attack you because all the nearby settlements died out long ago. Instead of the standard arcade shooter you'd expect, the game becomes more of a resource management game, where you have to keep humanity's morale high, since if you trounce them too hard, they'll give up, you'll starve to death, and the day would be saved. However, get their morale too high, and they could become a legitimate threat to you.

I quickly realized that this would be perfect for the jam theme - as said in the game's page, you have the unfair advantage, but you should only use that advantage sparingly. And while the game concept went much further than that, I decided I could easily make a prototype of it for this game jam.

So that was the idea decided - let's get to work!

The Beginning: Oh Wait, This Engine is Still In Beta

Alright, I started up a new rust project. I added the bevy crate. I managed to spawn a player sprite in the middle of the screen. I wrote a script that allowed the player to shoot fireballs-

And all of a sudden, disaster struck.

Now, don't get me wrong - I absolutely love Bevy from the time I've spent working with it. This is the first game engine I've used with an ECS system, and I really love the way it's handled. That said, sometimes, you get reminded that Bevy is still not at a 1.0 release.

Painfully reminded.

A screenshot from a very early version of the game. The lich player sprite near the top right is surrounded by glitchy and corrupted fireball sprites.
Oh no.

Turns out, Linux plus a potato laptop with an equally potato graphics card equals a very unhappy Bevy.

I've since submitted a bug report to Bevy's Github (here, the issue remains open as of this writing), and thankfully, this bug only affected me and other people with equally potato graphics cards who just happened to be on Linux, so this would only affect a very tiny percentage of players and I could, in theory, keep working.

That... proved to be easier said than done, though. This bug eventually made it very hard to debug certain UI elements down the line, and other than the practical problems, it was simply... demotivating to only see Missingno-esque sprites being thrown about rather than proper sprites. This ended up being a huge drain on my will to keep working.

But in the end, I just really wanted to accomplish something this time. So, I pushed on.

The Middle: The Grind Is On

I'm not going to get into details of how I spent each day during this jam and what I worked on - because the truth is, the development cycle was incredibly all over the place, and I don't even remember when I worked on what specifically. Instead, I'll be talking about the general things I've done, not necessarily in order, and give my comments on how I feel about it all.

So, the biggest mistake I made here was that I just wasted too much time. I ended up with several moments where I'd just delete and rewrite code over and over, because I couldn't decide on how certain things should specifically behave. Really, I could've even saved time here by saving old code rather than deleting it outright, but in the end, that ended up costing me a ton of valuable time.

I also tried doing a lot of things on my own when I could've saved a ton of time doing it with a crate instead.

Also, I spent a lot of time worrying more about if I could actually implement a feature in time, rather than actually implementing the feature. That ended up being another major time sink for me, unfortunately.

Really, other than bad time management, most of my problems came from unfamiliarity with the engine - there was a lot of moments where I simply just struggled really hard in trying to figure out what to do, because I had no idea how to do certain things. In the end, a lot of the solutions I came up with ended up being really badly hodge-podge and just a bunch of spaghetti - like, if I send my github repo in the Bevy discord's code review channel, I would probably get roasted so hard, and I would deserve every second of it.

Either way, though, I kept going and made slow but steady progress on the game. I implemented enemies. I made the player able to kill the enemies. I made the enemies able to kill the player. I finally implemented morale as the core mechanic. I added more spells, and I added a day system.

And then, it was the last day.

The Final Day: Where All My Mistakes Came Back to Bite Me

So, this was it. I had to scrap a lot of features because I just didn't have enough time left to implement any of it. Today, I decided to implement my second enemy - the archers - and then, with my remaining time, see what I can do about the polish.

The archer went decently enough, after having to rebalance some numbers due to accidentally causing lag hell otherwise. So now, I had the rest of the day to polish up the game.

I very quickly whipped up some sound effects with jsfxr, learned about bevy_kira_audio, and implemented that. Then, I tried to implement particles-

Oh. The plan was to use the bevy_hanabi crate for this, but it turns out particles are much more complicated than expected. Welp, I'm not gonna have enough time for that. So, I had to scrap a little polish. Me wasting a ton of time early on definitely bit me here.

I then spent the next few hours trying to figure out how Github Actions worked so I could cross compile, because that was also something I've never used before. I got that set up after a couple tries, pushed to the repository, and-

Oh. The WASM build doesn't work. I then spent the next hour figuring out why, and I had absolutely no idea. So, in the end, I had to scrap the web build, and just had people download the game. That sucks.

So, in the end, somewhat frustrated by the failure to add some bits of polish to my game, I quickly wrote up my itch.io page, fought with my graphics card to try and capture some clean screenshots for the page, and finally submitted my game. Due to my timezone, the game jam would finish way late into the night for me, so all I could do was go to sleep and see what happened the next day.

... the next day, I woke up and realized that the bug with the WASM build was because one of the crates I was using didn't work with WASM.

Oops. Next time, I'm just going to stick with rand rather than try to optimize prematurely with some other RNG crate that was "faster", but I didn't realize would not work with web builds.

So, what was the reception? What did everyone think?

Honestly, all things considered? The reception was pretty good.

The general consensus in the end seemed to be that while I had an incredibly good concept, the gameplay was just not there to support it. And really, I completely agree with that assessment. But let's break down the criticisms.

So, the most major one seems to be that the gameplay is just too obtuse. You don't know how much morale has changed until the end of the day, and it makes it very confusing to manage. Also, it's very much not clear how your actions actually influence morale at all. I actually hid the exact numbers for morale change initially, but I can definitely see now that it just turned the game into a frustrating trial-and-error experience. I also tried to add some tips on morale management, but that was clearly not enough. Shows the value of a good tutorial, I suppose, haha. Maybe if I had more time.

Also, the numbers were very poorly balanced. Within a few days of publishing my game, someone quickly figured out a cheese:

A comment from the user "gibonus", saying: "Really original idea and very fitting for the theme. I loved the feel of the attacks (real cool). But I think the gameplay falls flat. I guess the trick to get humanity's hope% up is to die just before the end of the timer? Once I got that figured out it felt very repetitive."
Oops.

Goes to show how important getting other people to playtest your game is, folks.

On the bright side, though, two compliments were also very consistent. First, the game concept has pretty consistently been called very unique and fitting to the jam's theme - thank you! But second, and a little surprisingly, I got a lot of feedback saying that the spells felt very satisfying to use. Granted, that was my intent going into the game - you're playing an immensely powerful lich, you should feel that your spells are powerful - but given that the sound effects were very sloppily made and in 8-bit, and the sprites were pretty much drawn in 5-10 minutes in GIMP, I was surprised at how well it apparently turned out. I'm glad the effects worked, I suppose, haha.

In the end, though, I got 22nd place overall out of 74 submissions, with an overall rating score of 3.477 from 17 votes. This is within the upper third of games, so honestly, for my first ever published game, I can't complain at all. I'm very proud of how I did.

What about me? What did I learn? What would I do differently?

Oh, man, where do I even begin? I learned a lot from making this game jam, so let's break it down.

First, I already knew that I had to keep my scope small, so that wasn't something I learned by doing. As I said earlier in this post, one of my biggest issues was actually the opposite - I worried about scope too much, and that just ended up robbing valuable time from me.

Most of my issues otherwise, then, came from my poor time management - which really is an ongoing issue for me - and my lack of knowledge in the engine. I made things very quickly, and there were probably many better ways to do certain things. I can't really point to too much specific here, so in general, this just gave me more experience in working with the engine, alongside its various crates like heron, kira_audio, etc.

Other than that, there are a few specific tips that I feel like I got badly burned by not knowing. Here they are:

Test your build process early.

I put off building my game for multiple platforms until the very end of the game jam - and that led directly to me both losing a lot of time figuring out the build process, and also being unable to get a web build out in time. Next time, I've definitely learned my lesson, and I'm going to build very, very early.

Don't put off polish for too long.

Of course, you want to have a solid gameplay first. But if you put off your polish for too long, you might end up with a subpar-looking game. I actually planned to make my own custom sprites for everything, but in the end, I just didn't have time for it. I also failed to implement particle effects because I put it off for too long, and by the time I wanted to do it, it was very much too late to implement it properly. Gameplay won't take your game to the top alone, after all.

Don't prematurely optimize.

This was also a big problem with how I approached things - I tried to avoid crates out of a misguided desire to "keep things light", and that put me off of using heron for a long time when it would've saved me time. I also tried to use alea, an RNG crate that was faster than rand, not realizing that it wouldn't work if I tried to make a WASM build. These are big lessons learned for next time - just make something that works, and realize that the industry standard (so to speak) is standard for a reason.

Have a plan.

Okay, that one was probably obvious to a lot of people, but I just did not have a good enough plan in mind for this game. I had no roadmap, and I spent a lot of time just figuring out what I wanted to add to the game next. A little planning will really go a long way, here. Next time, I'm definitely picking up something like Trello to help me keep things organized.

And as for what I'd wanna do differently.... well, a lot of what I just said above applies. Better planning, better knowledge. I would've sunk more of my time looking into crates than trying to make my own for the sake of "keeping the game light". I would've budgeted my time to this project better. Really, objectively, creating this game was a bit of a disastrous journey for me - but hey, it's my first time. ramirezmike (who, incidentally, wrote the devlog that basically directly inspired me to write my own, you can read that here) told me on the Bevy discord that this is basically the game jammer rite of passage, so I am just going to accept this and learn from it for next time.

What's next?

To be honest with you, Power UnLicheted was originally a much larger idea than this.

In the initial idea we had before it became a game jam entry, there were all sorts of mechanics like feinting, sending minion in to attack certain areas to harvest souls for you, and the biggest one - the game actually had an ending where you had to corrupt a "hero" into secretly helping you prolong the forever war that would feed you souls. It was supposed to be this entire roguelite resource management game, and the part I implemented for this jam entry would've just been a very small part of the game.

So, yeah, I have big plans for this. However, I think I'm actually going to shelf this entire thing for the time being.

I'm getting the feeling that with all the ideas I've been getting for this game, I'm just not experienced enough to make my dreams a reality yet. Something I've learned from watching various devlog videos on youtube is that you shouldn't be trying to make your dream game right away, or you'll just disappoint yourself - and I'm taking that to heart. So, for now, I'm going to push a quick update that includes a web build and also fixes a few wonky things soon, and that will be it for this game.

Though, the hope is that once I have some more experience under my belt, I'll definitely be coming back to this and making a full game out of it. Who knows when that will happen, though - don't get your hopes up unless I actually announce something, haha.


And that's it for my devlog! If you've made it this far, I hope this devlog from someone practically brand new to game dev has been an interesting/instructive/entertaining read for you. Of course, let me know any thoughts/suggestions/criticisms in the comments. Hopefully, I'll see you guys next game jam - or maybe even before then!

Get Power UnLicheted

Comments

Log in with itch.io to leave a comment.

Great post! I'm bummed you ran into so many issues, I sometimes forget that Bevy is still in its early stages. I definitely would say that as far as jam code goes it totally isn't a big deal if it's "bad" and I would be super disappointed in anyone roasting people in Bevy's code review channel, that would totally not be cool.

Totally agree about the dream game thing. I tried that and realized the same thing. It's honestly great to just shelve your dream game because it really eases the pressure on the games you do make.

And yes, as I said it, totally is a rite of passage to run into all sorts of issues on your first jam. I think you did really well despite all the issues you ran into!