Blog!

Welcome to my blog. Read all about my adventures!



The GMTK 2026 Game Jam is just coming to a close, and here is my after-jam reflection! I’ll tell you about my 96 hr process and my thoughts on how it went.

Process and Reflection

My process is going to be split into 4 sections organized by day: Wednesday, Thursday, Friday, and Saturday.

Wednesday

On Wednesday the theme was released at 12:00 PM. I got to brainstorming right away, along with my team. We came up with a number of ideas to fit the theme “Countdown”, but I’m just going to tell you one of them. Here’s our initial thought:
“Platformer. You start out as a normal character, but as soon as you collect some potion, and go through some door, etc. then a countdown starts. It goes 3…2…1…swap! And you change into a different creature, with a different ability. Every creature’s special ability is triggered by a random keyboard key (which you know, but won’t know until you change). To get through the level, you have to use various special abilities. There will be potions (or something else) to extend the countdown timer.”
It was around 1:30 or 2 pm when we came up with this, and we went with it. I wrote our Game Development Document, with all the information for our game. I decided on either PICO-8 or 1-bit color palettes, as I wanted it to look very retro. I came up with a list of creatures, and then we wrote a story for the game. This is what I wrote based on the team’s ideas:
“There’s a wizard, who is stirring a potion in a cauldron. His words type across the screen: ‘My life’s work is finally done! A potion of untimely transformations…what a waste of time.’ Then the screen switches to a bird. The player is a bird, who is flying. The bird somehow crash lands into the cauldron, being cursed with its effects. The wizard, realizing that he now has a test subject, locks the player (still a bird) up in a dungeon. The objective of the game is you have to escape the dungeon using various techniques (being a mouse to fit through a crack, etc.). The dungeon is a maze. But the goal of the game is to escape the dungeon, defeat the wizard (maybe when the player is the rock), and get some sort of antidote.”
I ended up cutting the maze out of the game, for lack of time. We really tried to lean into a whimsical style, however I think our 1-bit palette choice takes away from it.

It was only mid-afternoon now, and I took advantage of the rest of the afternoon to get the core mechanics down. I finished those, and designed a prototype level. I used an old animation I had drawn for the bird character, and worked with that. Overall, the latter half of Wednesday was packed, but successful.

Thursday

On Thursday, I designed the mouse character. Honestly, I can’t remember everything I did on Thursday. After a while, it just starts to blend together… Apart from that, I designed the first five levels. Designing the levels took longer than I would have wanted, but it sure was fun. I turned our story from Wednesday into the animation for the game, and designed an opening screen for the game. I also started planning out Friday’s work, and designed the fish character.

Friday

Friday was just as packed as the previous two days. I got into working, and created the frog character. Initially, I wanted it to be a pretty well rounded character, but in the end, his tongue was the main focus. The tongue is still a little bit finicky at times, but it’ll work. For the last character in the game, I wanted it to be a rock at first. (You were supposed to defeat the wizard in the end by falling on him.) I decided that this would be hard to recognize in the 1-bit style, so I changed it. After several iterations, I landed on a flower pot. I also designed the story at the end of the game, and the rest of the levels.

Saturday

On Saturday, I finished the game. I drew, animated, and coded the final wizard boss and the area where you fight him. I spent the majority of the day on this and then added the end credits. Just before 1:00 pm, my teammate finished the music, and we added that in. I am writing this at 2:00 pm, and the plan is to test and upload the game this afternoon.

Reflection

Man, our game was such an improvement from last year. I can’t say how thankful I am to all the people who helped while we made our game. Beautiful music, great ideas…it was a lot more than I expected. The overall look of the game is good. I think I might choose full color next time, but the 1-bit art definitely made it faster to create. The code is a little sloppy at times, but it works…so…

I’m excited to see how the rating period goes. I think we’ve really done a lot better since last time, and I can’t wait to know the results! Thank you, GMTK 2026.

Another issue! You can check it out here here. I've also pasted the title here:

Correctly type hinted methods do not show up in the method picker when connecting signals with type hints for custom classes.
After completing the MRP, I checked that the issue was still releavent for 4.7.1 Stable (my current version). It was, so I got to researching. Another contributer had already found out where the issue was in the code, and I based my research after that. Let me explain what's happening before I go further. When you connect a Node's signal to another script, you have the option to connect to an existing method. If there is an existing compatible method, it will show it as an option. The method is compatible when it has all the same arguments passed in it. The problem arises here. If we create a custom signal, with an argument that is a custom class, (using class_name), and try to connect that to a function we have written that takes this custom class as an argument, we will notice that the function we wrote won't come up as compatible. Why? Because it is a custom class. But why doesn't it treat all class the same?
I looked at the code where the issue was, and it used something called ClassDB, which is a list of every class. But in the docs:
Note: Script-defined classes with class_name are not part of ClassDB, so they will not return reflection data such as a method or property list. However, GDExtension-defined classes are part of ClassDB, so they will return reflection data.
It explains that ClassDB doesn't include custom classes defined by class_name. So I went in search for something else. As I was scrolling through the docs, this caught my eye:
Use ProjectSettings.get_global_class_list() to get a list of script-defined classes instead.
This blog post isn't done yet! Come back soon.

Read about my GMTK 2025 Game Jam experience!

The game we made, called Logic Loops (the theme was “loop”), is a puzzle solving logic game were you must move blocks out of the way in order to draw a loop. When clicked, each block moves the direction of the corresponding arrow on the center of the block. You can play our game here.

Journey

Our game plan went something like this:
  1. Concept planning
  2. Drawing and animation
  3. Coding
  4. Level design
  5. Upload to Jam website

Concept Planning

We started on the 3rd day of the jam, and did concept planning. In our orginal idea, players would have to create an animation loop using different mechanisms in the game. We decieded that this did not fit very well into the theme–so we changed to a different idea. In our new idea, players would move blocks out of the way to open up a path. They would then move a person through the path, to the next level. The entire path would form a loop.

Drawing and animation

After this, we came up with several prototypes for the blocks that the player would move out of the way. After several iterations, we came up with this design:

In all we made (and animated) 3 types of blocks:

Coding

We used the Godot Game Engine.

Blocks

Each block is an AnimatableBody2D with a basic script for each type of block. We used an AnimationPlayer node to handle all the movement and a RayCast2D to check whether the block could move. then we animated the CollisionShape2D’s position too, so that we could write very very little code. Basically all the code does, is get input (check when the mouse clicked it), and move the block according to its direction.

No Player

About halfway through coding it, we decieded that just having a loop as the map just didn’t quite fit the theme well enough. We brainstormed for a little while, and came up with this new idea:
Players move blocks out of the way of a path, and then draw a loop around the path to beat the level. In order to draw the loop, players will need to move blocks in different orders to make space.
In order to do that, we needed to make the loop:

Loop

The code for the loop is a little bit more complicated. We used a TileMapLayer for the loop. What it should do, is place down a tile (from our loop terrain) where ever the mouse is clicked (or click and drag). It should not be placed if there is a block already there. We created a terrain for the loop, and used set_cells_terrain_connect() in the code to add tiles when a tile was placed. In order to check whether a spot that was clicked (to make a loop) did not have a block in the way, we put blocks in a group called “blocks”. Then, when a spot was clicked, we checked whether any nodes in the group “blocks” had the same position. If there was, the loop would not be placed. The loop also handled when the level was beaten. When there were no tiles left with the ID of the tiles that were used to show the end of a loop, the level was won.

Level design

We designed 4 levels. Each one of the levels was there show what the game was like; they weren’t very hard at all. By the time we got around to making more levels, we had very little time before submission time was over, so we decieded to leave it as it was.

Upload to Jam

About 4 hours before submission time was over, we uploaded our game. Before, however, we first test ran our game. We then exported to HTML5, and uploaded our game to Itch.io, using this guide.

Reflection

What went well

For the most part, I think most of this jam went pretty well. We followed our plan, and were able to upload a game. We got a lot of great feedback!

What went bad

We started a couple days late. Had we started earlier, I think we would have been able to make more levels and maybe refine a couple of thing. The general concept of the game was rather simple too, I think with more time and a better game plan we could have done a lot better.

What to improve

The first thing I would improve is the number of levels–we only made 4. I would like to create more blocks, like a block that hops up and down, and potentially enemies the would move around, and also block your path. I would probably make the blocks smaller, so that they would fit into 1 tile. Several other participants had very similar ideas to ours, but added another factor, like time.

© 2026 Francis of ASCII