Pastadiablo

Productions

A cultist dancing

Cult Horror Jam Submission and Retrospective

PHEW! I did it! This is the first game jam I’ve done since, well, I think college. My final build didn’t have everything I wanted, had a few bugs, and there are some definite conveyance issues, but I am still super proud of what I accomplished in the 9 days of this jam. You can find it on itch.io here:

The Summoning

I also had a friend join this jam along with me, working separately on his own project. It’s awesome, and you should check it out here:

Ritual: Blood Summon

I think he’s gonna take best-in-show. It’s easily the scariest of the submitted games that I’ve played.

Changes

So, let’s talk about everything that’s changed, since the last post, huh? (Warning, it’s a lot. I meant to do a post in between this and the last, but time got away from me and I needed to focus on jammin’ rather than postin’).

Emotion Cards

In the end I only had three cards, one to convert a single cultist to each basic emotion. I chose to go for more levels and entities rather than more cards. I think I could have dropped the He Who Hungers entity type, which only appears in the final level, and spent the time drawing and animating that (about 2-3 hours) putting in the tech needed for 2 or 3 more card types. Ah, well, that is the power of hindsight.

User Interface

The UI got a complete overhaul. I added a special CardFanoutContainer (I may post this to the Godot Asset Library at some point, so I can use it in future jams). I created a draw pile and a discard pile (they never ended up being implemented, but they look cool). I added the Offering Requirements in the top right, so the player knew what they needed to do for any given level. And then I added a dialogue box that can serve as both a tutorial / information box, and also a way for the Entity to taunt and talk to the player. There is also a slider box that informs the player of the current Turn, that the Entity is acting, and/or that the player has Won or Lost.

Entities

I created two visual types of entities, although each of the 5 levels in game is a distinct “Entity” as I have it in my code. The Entity is defined not only by its visual type, but also by how it speaks to you, the player, as you attempt to summon it. Each one has a greeting, things it says randomly during the gameplay, something it says after your binding begins to take hold, something it says once the binding has fullen taken hold and it is under your control, and lastly, something it says when/if it defeats you by killing all your cultists. They also have different offering requirements.

The animations on these guys were simple, but fun to do. You can see my most common entity visual type in the animated gif associated with this post! That is the visual for the Watcher, Seer, Eye of the Past, and Lidded One entity types.

Soul Offerings

As I described in my last post, I modified cards to work on an individual Cultist basis, rather than an entire crowd. Changing the emotion of one cultist consumes a soul. Then sacrificing an emotional cultist creates an Offering of the correct emotion type. But the player has to be careful and deliberate! The Offering can be consumed just like any other soul when playing a card. The game prefers non-Offering souls over Offering souls whenever it can.

Music & Sound

On the final day I scrambled to add Music and Sound effects to the game. This ended up actually being pretty straightforward, and I grabbed a few free to use sounds from [zapsplat.com] for this purporse. Music, of course, came from the OG of free music, Kevin MacLeod.

The Rest of the Fucking Owl

I had to set up a system so I could slam out levels quickly (this came in handy as I created the set of all 5 levels within the last hour before the game was submitted), get Victory & Defeat working, create a menu and Credits, and just in general finish the rest of the game!

Retrospective

Perspective, or Lack Thereof

Thursday was a bad day for me. My last post here went up Wednesday. There’s a reason for that. I spent 8+ hours on stupid math that was completely unimportant to the game on Thursday, and by the time it was Friday I felt the time pressure enough that a mid-jam blog post no longer made sense.

You see, I’d downloaded a perspective shader that I used to make the cards react and tilt as you dragged them around (probably also a waste of time as that was one of the first things I did on like, Day 1, but I may be able to use that in other games so - meh). Then when I started drawing out the Summoning Circles, I felt like to be consistent it would be better if I could draw them as circles purely from a top-down perspective in Aseprite, and then translate them into a circle on the ground in the game using code. To do this, I used the shader. Easy, right?

Well, for that texture, yeah. However, arranging the cultists correctly around it? Not so much.

They needed to be aligned with it using a similar formula to the texture, but the texture was being modified by a shader, not by base godot code, and it was doing a couple of other things too. I needed to calculate the Cultists original position on the circle, rotate it back around the X axis by 60 degrees, and then perspective project it to a new point in 2D space based on its current 3D position. Oh yeah, and then Scale it so that it actually looked like it was further back.

At least, that’s what I convinced myself I needed to do. At that point though, as a friend pointed out, it would be easier to just build the game in 3D and use billboards. But I got stuck. I wanted it to work so BADLY. And I just couldn’t get it. No matter how much I massaged the starting position Z value, the Perspective Projection, the matrix math, the trigonometry, I just couldn’t get it to line those stupid cultists up along that stupid circle edge.

You know what though? Even if I DID get it to work, I’m pretty sure it would have looked like ass.

I ended up going to sleep defeated, resigned, and ready to basically try anything else in the morning.

So what did I do instead? Simple. I applied the isometric approach. I scaled the Y value of the textures by 0.5 and then basically did the same for the positions of the Cultists on the circle. All-in-all, it took me MAYBE 20 minutes to do.

I learned a lot about myself from that mistake. And how to not make it again in future jams. Time is a luxury, even if it feels like it is abundant. That was on Thursday, with the Jam submission being on Sunday at 8. I had time, I thought. If only I’d known…

The Final Day -or- My Most Productive Day -or- Crunch Sucks

This was the build the night before the final day:

Penultimate Build

It was close, but not quite complete. I needed to add Music & Sound. I needed to add Victory and Defeat checks. I needed to actually create Entities in the code (they did not yet exist), animate them, have them act, and have them talk to you. And I needed to create levels with different layouts, cultist counts, and behaviors. I woke up at 8am that day, and worked pretty much straight through until submission time at 8pm (I did take a break to make banana pancakes with my wife for breakfast, around noon. Yum.).

I also ordered Pizza Hut for dinner, hoping it held up to my childhood memories. It did not. I couldn’t finish the third slice. But we all make bad decisions when we’re sleep deprived and crunching, amirite?

The thing I regret most about this day is creating the He Who Hungers sprite. Don’t get me wrong, it’s cool and creepy, and perfect for the game. But the time lost spent on that could have been easily spent on making different cards and card types to make the game more strategic and fun, rather than just having a slightly different (ok, very different, but still) enemy on the final level.

With that time I probably could have implemented a deck-drawing and discarding/shuffling feature, to help with balance and make sure that within a certain number of draws you’re always guaranteed some of the cards. As it is you get totally random cards, which means you can have REALLY bad draws multiple hands in a row, to the point that your run is ruined. It’s baaaaad.

A working draw/discard mechanic would have been much better for the game. And I’d built card nodes so that animating it decently would have been super simple. They all have a “target position” and drift back towards it when no longer being dragged. Animate a flip (because the draw pile cards ARE real cards, just flipped over), reparent to the CardFanoutContainer, tell the container to refresh, and boom, its target position is updated and it slides on into position.

A deck/discard pile with shuffling and basic animations probably could have been added in about 1 to 2 hours, tops. And that is my non-optimistic estimate.

In the end, the build I submitted had a couple of bugs that I was allowed to fix the next day, but was pretty much complete (though beating level 4 was actually mathematically impossible):

Submission Build

Conclusions

My takeaways on things to improve on so far are standard stuff that I know, intellectually, but think I need to learn viscerally, via practice. I’m hopeful I will improve on each of these points in future jams:

Of course, those are my learnings and self-critiques. For my strengths and moments of pride, I’ve got a nice list for that, which I’m happy with:

In spite of my misses and critiques, I’m very happy with how it turned out, and I’m proud to call this game my own. Be sure to check it out (if you haven’t already) and let me know what you think on its itch.io page! I’ve had lots of thoughts about it myself, and while I’m not sure if I’ll ever revisit and update this particular game, I learned so much doing it, and am so grateful I had this opportunity to participate in this jam.