tl;dr: I participated with a friend in Global Game Jam 2023, and we made a first-person shooter in which you are a tree creature that must defend itself against wood-cutting robots!
You are a walking tree creature, and you must survive as long as you can through endless waves of wood-cutting robots. In order to defend yourself, you must place roots near a pool of fresh spring water. But these springs are fickle, and they constantly dry-up, so you must keep uprooting yourself in search of fresh water and safety.
Global Game Jam is an annual 48-hour game jam.
The theme this year was "Roots".
This time around, only Zaven Muradyan and I worked on this.
What we didn't make
In most jams, you don't have to make everything for the game yourself, but we often make most parts anyway. This time, we borrowed a bit more than usual, because we were exploring more new areas of development than usual.
The things we didn't make ourselves were:
- Gun model (with slight modifications): https://sketchfab.com/3d-models/gun-low-poly-058c7003e141492ca55bae95641bde37
- Lowpoly_mechatank: https://sketchfab.com/3d-models/lowpoly-mechatank-390528276a424c5dbde791b4981f9d29
- Chainsaw: https://sketchfab.com/3d-models/chainsaw-fcc62e26b8bf483e93f2fa7d7c75f453
- Character model: https://sketchfab.com/3d-models/venus-pie-trap-1021aa85a7f94fb3a8038e20cccba651
- Gunner enemy: https://sketchfab.com/3d-models/wk5a-9b7559e15007413595690d4fdea711ac
- Fireball visual effects: https://sketchfab.com/3d-models/fireball-vfx-911322f594b2480e8c3f9d49ff7619c6
- Bubble sound: https://opengameart.org/content/pop-sounds
- Stream sound: https://opengameart.org/content/stream-sounds
- Machine sounds: https://opengameart.org/content/30-cc0-sfx-loops
- Fire sound: https://opengameart.org/content/spell-4-fire
- Tree growth sound: https://opengameart.org/content/growth-spell
- Explosion: https://opengameart.org/content/bombexplosion8bit
- Fire sound: https://opengameart.org/content/fire-loop
- Heightmap plugin: https://github.com/Zylann/godot_heightmap_plugin
- Stylized grass shader: https://godotshaders.com/shader/stylized-grass-with-wind-and-deformation/
- Pool shader technique: https://godotshaders.com/shader/water-hotspring-exercise/
- Music: https://gamesounds.xyz/?dir=Public%20Domain/Jungle
- Font: https://little-martian.itch.io/phased-font
|A beautiful chainsaw bot.|
|We added a rising particle effect to help indicate from a distance which pools are currently hydrated.|
|The enemies spawn in waves, and grow in numbers!|
|The level is a combination of heightmap-based terrain and box-based geometry.|
|The pool shader was fun to make!|
- Neither of us play many first-person shooters, but we decided to make an FPS because it seemed more interesting to make.
- During our brain-storming phase, none of our ideas really jumped out at us as being particularly compelling.
- We almost made a 2D tower-defense game instead. We had all of the details planned-out for one.
- But ultimately, we decided it wouldn't be interesting enough. Our idea wouldn't really be creating anything novel in the tower-defense space, and neither of us would be practicing any skills that we weren't already pretty comfortable with.
- Both of us have made a lot more 2D games, and neither of us had made a 3D game using Godot, so our goal was to learn and practice our 3D skills for this jam. We definitely succeeded!
- Our game turned out pretty well. I think the main mechanic works decently, needing to root in a pool and regularly move around to find a new pool keeps the pace moving, and adds a frantic element.
- Both of us enjoy making simple chiptune music now-a-days, so we were kind of looking forward to making some music for this jam. But we ran out of time, and also decided that chiptunes probably wouldn't fit the mood of our game very well.
- I was surprised to discover that Godot doesn't come with any heightmap-based level-creation tools built-in.
- Fortunately, we found this plugin, which is pretty polished and worked out great for us.
- I was impressed by how easy it is to setup a navigation mesh and get enemy units to path-find.