Build, expand and survive in a magical hand-painted world filled with friends and foes. Grow and manage your settlement in the day, defend it through the night, and rebuild your broken airship to claim your escape!
Build, expand and survive in a magical hand-painted world filled with friends and foes. Grow and manage your settlement in the day, defend it through the night, and rebuild your broken airship to claim your escape!
Crashbound began as a prototype inspired by the Kingdom series, created to explore a side-scrolling blend of strategy, town-building, and action.
Development started as a small-team effort alongside my collaborators, with each of us contributing different skills to the project. Early versions were rough and heavily experimental, with frequent iteration on mechanics such as NPC behaviour, resource flow, and day-night pacing. As the project progressed, we refined these systems, improved visual clarity, and focused on making the world feel alive and reactive to the player’s actions.
While Crashbound is still an evolving project, it has been a valuable opportunity to explore larger-scale systems design, long-term progression, and collaborative development beyond a short game jam timeframe. The project continues to shape how I approach prototyping, iteration, and scope management in future games.
The jam version of Gun Groove Alley had quite simple art, and I created some simple animations to allow the various characters and elements of the game to 'bop' to the beat, also when it came to having the cats aim their weapons, we simply flipped sprites.
With the updated version, all of our characters were reworked and made using Spine, a pretty cool piece of skeletal animation software. This allowed us to give the characters a little more personality, flipping around in a sort of 'Paper Mario' style and actually pointing their gun at the enemy they wanted to shoot at. I learned a little more about implementing these features such as how to control bone positions to acheive the aforementioned aiming through code.
The ways waves were handled in our initial jam version was less than ideal. Essentially a set amount of each enemy would spawn and each one would just increment slightly each wave, then everything was spawned randomy out of those amounts each wave. With the updated version, we decided to hand craft 25 waves using scriptable objects. They contained three bits of data.
Hint: Displayed on the hint bar before the wave begins. If filled in, the hint is pushed to the hint bar and prioritized in a queue of random text. Important hints are displayed in green text.
Beats: Specifies when enemies spawn during the wave. This allows for flexible pacing, with options for slower waves (e.g., every second beat) or more intense waves (e.g., every beat).
WaveSteps: These are structs holding integer values that determine the enemy composition for a given wave. Each WaveStep defines the number of each enemy type to spawn. For example, one WaveStep might spawn 1 low-tier mouse, while another could spawn 2 mid-tier mice, 2 birds, and 2 high-tier dogs.
We decided that we wanted the game to not just stop at wave 25, so I threw together a simple function that would generate random waves with increasing difficulty. Simply feed in a wave for it to use as reference, for instance the final wave. It will shuffle around the order of the wavesteps and then take a certain amount of those wavesteps, duplicate them and stick them onto the list too to give the player bigger and bigger waves. An instance of the 'Wave' Scriptable Object is generated with this info and set as the current wave.