Easter Egg Crash – Developer Log


Easter Egg Crash is my entry into the Knox Game Jam 2026 game development competition. This is my fourteenth consecutive year doing a 48 hour game jam. My first game jam entry was Amish Brothers back in 2013.

We had a kickoff for the event with some of the game developers in Knoxville on Friday. It was good to see everyone at the annual get together. At the meeting, we put all of the themes on a virtual wheel and spun it which is always fun. The theme for this year’s Knox Game Jam was limited resources.

Since this was Easter weekend, I decided to create an Easter themed game. I had previously made Easter Egg Hunt, which is a competitive scramble to collect eggs of the specified colors. For this game jam game, I decided to make a puzzle in the style of Puzzle Fighter, but with colored Easter eggs instead of gems. I thought about having a limited number of eggs to fit the theme. Instead of fighting an AI controlled character, this game has set goals similar to a game like Candy Crush. Currently, you just have to clear 5 eggs of each color, which increases by 5 for every level. The diamonds that clear the eggs of matching color do not count toward the goal total.

The objective is to connect eggs of similar color, and then use a diamond to clear the eggs matching the diamond’s color that are adjacent above, below, to the left, and to the right (diagonals do not count). When eggs and diamonds are cleared, all of the eggs above will fall similar to other falling block games. The trick is that you can create combos by strategically placing diamonds on other eggs to be cleared. In this game, combos don’t provide any extra benefit, but could be used as a goal in a future version.

This style of puzzle game is good recursion coding practice. I have a board data structure, which contains all of the landed eggs (diamonds are also considered “eggs”). Whenever an egg pair lands, it gets added to the board data structure. One of my biggest gripes with GDScript is that it does not have a 2D array data structure, but I was able to figure out how to simulate one with a list and get/set methods passing in the row and column indexes. Basically row is the list index divided by row size (rounded down) and column is the list index modulus the row size. After the eggs are added to the board, the doCrash method is called which checks all of the eggs on the board. If the egg is a diamond (isCrash boolean is true), then it finds all of the of the adjacent eggs. It is basically the painting algorithm that I covered on a Knox Game Design podcast a while back. If an adjacent egg is the same color then it gets added to the “connected” list, then the getCrashConnected is recursively called for all eggs adjacent to it. The recursion stops when it the adjacent cell it not of the same color, it hits one of the boundaries, the adjacent cell is empty, or the adjacent cell has an egg that has already been added to the adjacent list. The last check is really important, otherwise you will end up in an infinite recursion loop. The nice thing about this method is that the connected list ends up with the entire list to be cleared, so after the recursion is finished, you just loop through that list and remove those eggs. Once the eggs are removed, the other eggs are then dropped, then the crash check is completed again, in case that there is a combo. The loop completes when the crash check returns no eggs to be removed.

Looking back, I should have used an enum for the egg color instead of using an integer. Creating random integers is easy. The statement randi() % + 1 returns a random number between 1 and 4. I created an Egg prefab, which has all of the egg and diamond models as children. Initially all model objects on the Egg prefab are hidden, then one is set to visible based on the egg color and type (diamond if isCrash is true or egg if isCrash is false). If this was an object oriented, I would have made Diamond a subclass of Egg, but I’m not sure if that is possible to do in GDScript.

I created the egg and diamond models in Blender 5.1. For the egg, I used used the default ICO sphere mesh and translated the upper vertices upwards to give it more of an egg shape. I just winged it and didn’t use any reference pictures, since I know what an egg is supposed to look like. I exported the layout and made textures in Gimp. I just made simple polka-dots, checkerboards and spirals using Gimp filters. I used a star pattern from a memory card game I had developed to create the star shape on the blue egg pattern. I should have used one egg model and swapped the texture based on egg color, but I did not have time to figure out how to do that in GDScript.

For the diamonds, I used the Extra Mesh Objects addon to add a Gemstone > Diamond mesh. It seems like it was made for this sort of thing. I used it in my Jewel Swapper game years ago.

For the music, I went with GarageBand on the MacBook Pro again. I was able to create game play and title music in about an hour. I used bfxr for the sound effects. If I had more time, I probably would have done something a little more unique for the sound effects.

The background image for the title screen and gameplay was created in Krita, using a simple gradient. I used one of the brushes with green to make a grass type background around the border. I originally had a green splatter background for the game screen, but it just did not look good, so I ended up going with Gmip’s Render > Pattern > Sinus and gave it Easter theme colors.

This was my first time finishing a game in Godot Engine for a game jam. Previously, I started a Godot game which ended up being Shape Quest in GameMaker. I also made Sky Combat in Godot, but it was not for a 48 hour game jam.

I was impressed to see the improvement in Godot. The 2D UI system it much better than I remembered, but still not at the level of Unity. The GDScript programming language it uses reminds me of the syntax of Python (indentation spacing is important) but also has typing that reminds me of Typescript. After I uploaded my game, one problem I noticed was that the title screen would not fill the entire space allocated for the game on some systems. It did not appear to be a browser problem, because all browsers on one system would display it correctly, but when I ran it on a laptop all of the browsers would display a small title screen with a lot of gray background. I found that the fix to the was creating a Camera2D node, setting the properties for it, and then resizing the 2D UI components for the Camera2D.

I am definitely thinking about developing this game further. I’ve already made one update, so that the eggs now scale down when they are cleared. I really want to have a cell fracture type effect, but I’m not sure if that still exists in Blender, and I would need to learn how to play model animations in Godot. I would like to add new goal conditions, so that there are maybe other types of eggs that must be cleared. I think the base gameplay in the game jam is solid, so adding additional features should not be a problem.


Games Catalog


I wanted to let everyone know about the new site for hosting my games at LDSMITH.GAMES. I plan to eventually move all of the game content (game builds, leaderboards, screenshots, videos) off of this site except for the developer logs. I have had that domain registered for a few years, but I’ve never done anything with it. Last year I got a new hosting account setup for it. I also started learning about Angular and the MEAN stack (MongoDB, Express, Angular, and Node). This is my first attempt at creating and deploying a MEAN stack, and it was not as easy as I had expected.

NoSQL databases are new to me, but I’ve been using JSON for various projects for years. Since MongoDB is primarily based around JSON, it was not too difficult to pick up. The biggest challenge was exporting all of my games data in MySQL into JSON format which can be loaded into MongoDB. Eventually, I was able to create an SQL query that captured all of the game data that I wanted to migrate to the games catalog site and was successfully able to import it into MongoDB. For this project, I have been using an Ubuntu VM in VirtualBox as a DEV environment, then I export the working components over to the live site.

After going through some tutorials, I was able to get an Angular environment up and running. The new Angular site displays previews of all of the games on the main page, and provides a search bar to search by title. The nice thing about Angular is that it allows the main catalog page to filter out the games as you type. I was able to configure it to pull all of the game data from MongoDB. The only downside is that all of the game blog data is included in one huge query, so eventually I would like to limit the size of that file and load in the game blog data as needed. I also need to write a script to pull all of the images down from this site, so that the images are hosted on the games catalog site.

Another problem I had was getting the web games embedded into the game details pages, which I have not figured out yet. I would really like to have it so that when you click on a game on the main page, it loads the game in an embedded window there without having to go to the details page. Currently, I just provide the links to the appropriate page on this site to play the game, which is an extra click.

I have been exploring setting up my own crypto token, which I was able to establish on the Solana network. The token’s name is LDSMITH and the address is EkJUhSQeQYuozWaberMqDELRahSkVgrUqYKRTw4e7EoK and can be viewed on Solscan. I may write a more detailed post on crypto currency at a later date. My plan is to allow users to connect to the ldsmith.games site with their digital wallet, and then use the LDSMITH token in the games. The token could allow players to donate to the development of the various games or buy digital goods that can be used in the games. About a year ago, I setup the Kitty’s Adventure digital trading card on the Ethereum network at OpenSea. Using digital currency and trading card in the games is still just in the planning stage. I also would like to create a new leaderboard that is blockchain based.

Eventually, I would like to have all of my games hosted and playable at LDSMITH.games, then this levidsmith.com site would just be for development blogging. However, I think it may be best to keep each game’s canonical page on this site for SEO purposes, since many search engines point to this site for game information. Breaking those links would be like starting from scratch and losing years of indexing history.


Old Timer Peg Game – Developer Log

This is my (at least) 26th time doing a 48 hour game jam, and the first game for the newly rebranded Knox Game Jam.  The rebranding was needed since other jams were no longer community events, with trademarked names, and overall becoming corporate with sponsors making money off of the free games that the community created with no compensation.  Overall, I am happy with the new direction, having our own rules and free from any edicts from people not associated with Knox Game Design.  Sorry to rant, but I thought it was necessary for people to know the reasons behind the change.

Anyway, this is the old classic peg game.  I think others have created video game versions of this before, but I have not noticed any 3D versions with options like peg color.  To fit the theme, I made the user complete a jump every 10 seconds or he will lose.  It keeps the game flowing so that the player can’t take forever to make a move.

Basically the holes are laid out in rows and columns programmatically.  Row 0 column 0 is the first hole.  Row 1 column 0 is the second hole.  Row 1 column 1 is  the third hole and so on.  Actually, the hole “number” doesn’t matter and is not stored, but each hole does “know” its row and column.  Each hole has a reference to the peg that it holds, or null if the hole does not currently contain a peg.  Based on the row, column, and offset, I was able to calculate if the selected destination was valid (hole peg is null) and the if the hole between contains a peg.  If those conditions are met, then the hopped peg is destroyed, the destination hole’s peg is set to the moved peg, and the source hole’s peg is set to null.  It’s important to remember that for every hole, there are six possible adjacent holes to check.  While programmatically the holes are stored in rows and columns, when laid out visually the holes are shifted and may not be adjacent based on its row and column index.  For instance, peg 8 is adjacent to pegs (4,5,7,9,12, 13) but not (6,11) based on the row/column positioning.

Old Timer Peg Game - data structure and display layoutDetermining the end condition isn’t much more difficult.  For each of the remaining pegs, determine if two holes away in a straight line is empty, and if one hole in the same line away contains a peg.  If that condition is not met at least once for any of the pegs, then the game is over (no valid moves left).  If the game is over and only one peg remains (just by simply checking if the number of remaining pegs equals 1) then the player has won, based on the traditional win state of the peg game.

The biggest challenge was determining which hops were valid.  I came up with a big if/then mess for determining whether a hop was valid.  For the end game state, I cleaned up the checks some by adding a list of 2D int arrays for all of the checks.  Using the list allowed me to do the checks based on row and column offsets.  For example, [-1,0] checks if the previous row, same column has a peg.  [1, 1] checks if the next row, next column has a peg.  For the empty hole check the indexes are multiplied by 2, so [-1,0] checks two rows above, same column is empty.

By the way, I never mentioned that all of this was implemented in C# and Unity (does anyone remember when Boo used to be a scripting option in Unity?).  Therefore, this algorithm could be applied to any programming language.  This may not be the best algorithm either, but it’s what I came up with for a 48 hour game jam.

Old Timer Peg Game - day one buildThe models for the holes were not too difficult.  I started with a simple cube in Blender and then merged the top vertices on Y to make a triangle.  Then I used a new cylinder object and boolean modifier in Blender to make the hole.  After exporting to FBX and importing into Unity, I realized that this was not a true equilateral triangle with sides of equal length.  Therefore, I had to go back into Blender and reposition the vertices (in overhead view) to make the sides equal length and reposition the peg hole.  By the way, I also used the same cylinder dimensions for the hole, but I did find a reference picture of a golf tee to make the rest of the peg.  Now the newly created triangles with holes lined up in Unity.  Next I needed to fill in the empty spaces.  I did this by adding inverted triangles for each row below the hole triangles, excluding the final row.  Unfortunately, inverted triangles did not line up correctly either.  This was because the triangles were not centered around the center of mass, so I had to go back and do some high school geometry and trigonometry to determine the correct X and Z positions for all of the vertices so that the center of mass is centered at 0,0.  For those wondering, the triangle mesh on X  goes from -1 to 1, and on Z the triangle mesh goes from -0.8660 to 0.8660, which I vaguely remember being one of those magic numbers that we are always supposed to know from math class.  Equilateral triangles have all angles of 60 degrees, and the sine of 60 in degrees is 0.8660.  For what it’s worth, 60 degrees in radians is PI/3.  We can also verify that all side lengths are 2 units using the Pythagorean theorem.  I even checked it on my TI-85 calculator!

  • (-1, -0.8660) to (1, -0.8660) = ((-1 – 1)^2 +(-0.8660 – (-0.8660))^2)^(1/2) = 2
  • (-1, -0.8660) to (0, 0.8660) = ((-1 – 0)^2 + ((-.8660) – 0.8660)^2)^(1/2) = 2
  • (0, 0.8660) to (1, -0.8660) = ((0 – 1)^2 + (0.8660 – (-0.8660))^2)^(1/2) = 2

Old Timer Peg Game - making triangle and hole in Blender

I used GarageBand again for making the music.  I tried going for a classic country and western theme, but GarageBand is really limited with those types of instruments.  I’ve been using an alternating high low background tone in my games recently, which seems to work well, but worried that it may create some sort of hypnotic state in people.  I don’t have any proof of that, but it could be similar to flashing lights for visual hypnosis.  The main melody is spread lengthier over the up and down tones.  Then I add a drummer track, which is definitely the most automatically generated part of the song, however I do choose the soft/loud/simple/complex siders and which parts of the drum set to include at each section.

Old Timer Peg Game - popping soundThe most humorous part of the jam was creating the popping effects for the pegs.  It took me a few minutes to find something that made a good popping sound, but eventually I came across my can of shaving cream which made the perfect sound when the lid was popped off!  I recorded a few pops in Audacity, cropped and exported the good parts to WAV files, and it was ready to be imported into Unity.

Some of the things I would like to add are an overall timer, so it lets the player know how long it took him to know to win.  I would also like to add a leaderboard, but unfortunately the solution to the peg game is easily found online, so the only real challenge would be to see who can run through the steps the fastest.  Setting the initial start hole to random would add some randomness, but someone could keep restarting until it matched the steps in his solution.

I would also like to add additional challenges such as “leave 8” pegs with no valid moves, which appears to slightly more difficult.  However again, the solutions are easily found online.