A Godot monorepo full of games, addons, and scripts.
My game may or may not need unit tests, but my addons sure as hell do.
Unfortunately I dropped my tests and GUT during the Godot 3 to 4 transition. Hopefully we'll bring these back soon!
Some more thoughts: unit tests for a game jam?
The playable versions of these games are on my itch.io page: russmatney.itch.io.
They should all be playable via dino on itch.
src/demoland
A Metro game. Developed mostly as mvania19. In the last week of that jam, I created the HatBot levels, leaving these 'demo' levels behind.
When metro was refactored, this was the first proof of concept, to be sure Metro wasn't coupled to HatBot too tightly.
Note Demoland is not independently deployed to itch - it's only playable within the Dino main game.
src/ghosts
Submission to the December 2022 godot wild jam (gwj).
A simple platformer with some lighting effects. Use your flashlight to stun the glowmbas.
No real game loop or win state yet, just a few halls to wander.
src/gunner
The 'cozy' name here is a bit optimistic - I want to push the game in a cozy-direction, if possible. This comes from a cozy 'runner' idea, which has me feeling cozy autumn envy.
Created to explore adding Juice to a platformer, but with potential to grow into something more interesting. Maybe needs more break the targets levels?
Much of gunner (the player controller) was lifted into tower jet (dino game).
src/harvey
So-named after the Harvest theme from January 2023's ludum dare.
This is an Overcooked -for-farming prototype, in which you gather and plant seeds, water them, harvest produce, and deliver it.
It features some AI bots that do more work than you ever could, to make the game a bit more active.
src/hatbot
My first Metroidvania!
A submission to the Metroidvania Month Jam in March 2023.
The work in this jam included metro and major improvements to juicy camera,
The 'hatbot' portion (zones/rooms, enemies, bosses, sounds) only came out in the last week of the jam.
src/pluggs
Just a teaser - crawl around as a bucket of pluggs. More to come!
src/runner
A rough couple of demos of a
RunnerRoom.gd
helper I wrote to create an
infinite
runner.
There are wide directions to take this, but mostly it'd be nice to clean up the structure so I can put together multiple levels/games in this style.
The main inspiration was a cozy autumn leaf catching runner, but I've had many ideas since, including Dream Runner, which is hopefully coming soon!
src/runner/park
src/runner/prime
src/runner/gravity
src/runner/gueststar
src/snake
A rough submission to a juice jam in Jan 2023.
I have high hopes and future plans for this one. Unfortunately, at the moment, it's a piece of crap.
src/tower
Submission to godot wild jam in January 2023.
Built on top of gunner 's player controller, and (nearly) integrating procedural level generation via reptile. I say nearly because a lot of time was invested, and the final levels _were_ generated, but it's not yet a random game.
I'm excited to restore this game and push it in a Spelunky -like direction (maybe
traveling from bottom to top, instead of top to bottom?)
See also: future games (roadmap)
beatemup lifecycle tool roguelike?
(maybe a better name: pants)
The idea is that when you lose all your health, you lose a hoodie (or your pants). When you start up again, it's a brand new hoodie (or pair of pants). Underpants?
addons/beehive
Game AI abstractions.
Named after a pun on 'behave' (from behavior trees ), and also because bees are drones, and this addon is about controlling behavior.
I'd like to extend this to include behavior tree and goap implementations.
A finite state machine implementation.
addons/beehive/machine.gd
addons/beehive/state.gd
These state functions can refer to
an
actor
, which
is the machine's parent (i.e. the
player/enemy/npc).
addons/camera
A 2d camera. In the code, just called 'camera' and autoloaded as 'Cam'.
I'm pretty happy with the camera at this point, and I hope to clean it up and make a video to cover it: juicy camera video.
These points dynamically impact the camera's zoom and focus.
They can be added anywhere in any scene, and activated/deactivated.
Heavily taken from Squirrel Eiserloh (SMU Guildhall) 's
Juicing Your Cameras with Math video: https://www.youtube.com/watch?v=tu-Qe66AvtY
Also taken from Squirrel Eiserloh (SMU Guildhall) 's
Juicing Your Cameras with Math video: https://www.youtube.com/watch?v=tu-Qe66AvtY
A more exaggerated slow-motion.
This needs a bit of love, as it's been broken since the POIs/POFs were introduced.
Helpers for displaying hints to the player about important things that are offscreen.
Maybe these should tie into the POIs/POFs?
addons/core
An addon full of basic utilities.
Extensions to gdscript 's standard library.
Pretty-printing dramatically speeds up log-reading (debugging) time!
It's also nice to re-use the pretty printing in various debug UIs.
A dashboard with a few debugging helpers for displaying values on screen.
Better than logging to the console in some/most situations.
Some defaults for getting things going, plus some nicer ones too!
Textures for providing basic lighting to scenes
addons/dj
DJ supports playing sounds and music.
A DJ
SoundMap
and
DJ.play_sound("pew")
includes helpers for playing a random
'sound' from a list, and modifying its pitch to prevent it
from playing that same damn PEWWW every time.
Hopefully soon DJ will have a UI to support testing sounds in the editor. Imagine that!
Note that gdfxr is a very useful addon for generating sfxr sounds right in Godot.
addons/hood
Hood provides useful HUD components.
It has taken on several other things, such as the Actions API and Quests, but those are being refactored into other plugins (in this case, trolley and quest ).
addons/hood/ActionHint.tscn
Likely being refactored into Trolley, which takes on more 'controls' work.
A helper displaying an action label and the input key for performing it. Can be used with the Actions API, but can also be used independently (to display game controls, for example).
Hood.notify
addons/hood/Notifications.tscn
A simple way to throw some text on the screen and provide some feedback to the player.
A Zelda-like health container that supports health as an integer from 0 to 6.
A screen-take-over popup with a fixed structure. Useful for user messages more significant than notifications.
Hopefully this can be genericized more going forward.
A rough prototype of a quest system.
Needs more love, not used much yet.
Likely getting it's own addon ( quest ).
addons/hotel
Hotel was originally a Room manager, but it has grown into a full game state db.
It supports 'booking' data based on your static scenes, 'registering' nodes with the hotel when a node is _ready(), and 'checking-in' data as in-game events happen.
The main feature supports reloading zones and rooms that have already been visited, and restoring the state from the player's last visit. Ex: was this candle lit? What was this enemies health? Was this item already found?
Hotel as a UI view that can be used to access game data in a debug overlay or in the Godot editor.
Pulling data from your static files makes it simple to connect nodes together - the initial use-case for this was making it possible for teleporters (elevators) in different rooms/zones to reference eachother as a destination.
Hotel exposes a useful
Hotel.query({})
function as well, which supports several
basic keys (e.g.
groups
,
is_player
) and a general
"filter"
key for fetching whatever data you
need.
Hotel also offers a signal for all data
check_ins
,
which provides a nice separation of concerns for updating
the HUD or sending out notifications based on changed
data.
Related but not yet implemented: I hope to get to hotel themes soon, which is a step back toward the room management idea, but with a focus on data-driven or constraint-based look and feel (i.e. constraint-based room design ).
addons/metro
Metro.gd
,
MetroZone.gd
,
and
MetroRoom.gd
provide helpers for managing zones
(areas) and rooms in map-based games. (e.g.
Metroidvanias,
dungeon
crawlers, etc).
Originally built along side
mvania19
/ hatbot,
it has since been refactored out into a reusable addon, and
applied so far to
src/dungeonCrawler
.
addons/navi
Navi, because navigation (and Zelda).
Navi scene management and basic menu components.
The default Pause, Win, and GameOver menus are here, for when you're jamming and you just don't need to implement it again.
addons/reptile
Reptile is so-named because it originally housed tileset/tilemap helpers.
It has evolved to support tilemap generation, in a step towards procedural content generation.
These features worked in a rough editor prototype, but didn't quite turn the corner when the tower jet deadline hit. It was then broken completely in the godot 3 to 4 transition.
I hope to restore and then continue extending this soon, most likely with a wave function collapse implementation.
For now, it's still quite useful to be able to grab a working autotile when you need a quick platform or room to work in.
addons/thanks
Provides a basic scrolling credits scene. Consumed
by
src/credits/DinoCredits.gd
Sometimes I call this T. Hanks, and then I laugh to myself.
addons/trolley
Trolley is all about the controls.
It's simple for now, providing some simpler interfaces into godot's Input features. It should evolve to provide controller editing and debugging views, as well as an actions api.
dino shader/tween helper addon
recently hit this word again, as a game/mechanic idea: shades
godot addon for vim style window navigation within godot
(escape as entrypoint, ace window style, plus global command/search bar)
an editor-level actions abstraction
(defcom+rofi for godot editor and game commands)
A wrapper providing a nice API into ink tools.
Currently implemented in
addons/hood
,
but likely moving to
addons/trolley
soon.
The Actions API lets interactable entities (doors, lights, etc) define their own Actions (i.e. labels, functions, inputs to trigger them, conditions).
Entities that can perform actions can 'detect' what actions are near them, and execute them (via player input, or otherwise via code).
Supports connected rooms in 2D map-based games.
Features:
Support for building infinite runners.
Persisting and reloading game state across godot's node lifecycle.
None! Hopefully something via ink soon.
While building up games, it's helpful to create 'Gyms' along the way to test out specific scenarios.
These are basically demos or debug rooms, just a place to throw a few nodes together so you can test things without loading and playing the whole game.
Ideally dino would pull all the gyms together and expose them in a menu, so they can be played from the main game, and not just in the editor.
A DinoGame is a way for games to opt-in to some basic game management features (e.g. Player respawning).
Dino includes some babashka -based helpers (formerly bb-godot ).
The
bb.edn
(and
src/bb-godot/*
) provide a growing number of
bb
tasks, implemented in
Clojure
(via Babashka
).
bb-godot was briefly a separate repo, until repo-hopping fatigue convinced me to focus my efforts on dino as a monorepo and sandbox.
Re-exports aseprite files as sprite sheets on save.
Godot re-imports the updated files automatically (when you re-focus Godot), so this makes for a very nice feedback loop.
Building all of dino or one of its sub-games.
A few commands used to support symlinking to addons on your local machine based
on a manifest like:
{:gut :bitwes/Gut
:MaxSizeContainer :MattUV/godot-MaxSizeContainer
:inkgd :ephread/inkgd}
Symlinking to local copies can be problemmatic - these helpers used to manage it for me, but I've moved away from it.
There are several godot addon managers to choose from. At this point I think vendorizing (just including the addons directly in the repo) is the answer, and most addons encourage this in their install instructions.
Vendorizing makes it much easier to edit and improve the addons in place, and saves your less technical teammates alot of trouble (e.g. when they want to try to tweak their own art in Godot's editor).
I love rooms (game design element) as a unit of game design and iteration. A rooms api should support that.
Dino has seen a few different rooms api approaches already. The Runner Room code managed cycling rooms ahead of the player so they could be revisited. In Tower Jet, the Reptile Room was built up to generate (and regenerate) the tiles based on noise images. Then, Mvania / Hatbot featured a fuller room and area management, including room data lifecycle via hotel and pausing/unpausing the rooms based on the player location.
A Dino addon.
---
A godot addon for working with controls.
Provides an autoload for a simple runtime API, as well as an editor pane and a few UI components for displaying controls to the user.
A Dino game.
---
Open world -ish... i probably just mean non-linear. Explore as you will! Travel requires subway tokens, which you can buy at delis.
A Dino game.
---
Play: ghost house on itch.io
submission page: https://itch.io/jam/godot-wild-jam-52/rate/1833748
One angle I'm taking on this dive into game development is cloning/modeling games off of classic genres and games themselves.
I hope to fill dino with examples across a variety of genres. This feels like a useful set of capabilities to develop, and it should make it easier to up-and-run with misc game jam ideas.
A Dino addon.
---
I'm really out of my depth on music in games, but I love the idea of making something from scratch.
Probably the advice is find some free assets and give credit
But it feels less personal, and I think music should be personal. As long as it gets out of that sounds-like-shit phase.
Hi! My name is Russ!
I make open-source games in Godot, and I build dev tools in Clojure.
A Dino addon.
---
The latest in a series of fiercely named addons and really-reaching game titles
(whatever dino is.)
Sunday Funday
A Dino game.
---
A run-n-gun focused on adding as many juicy effects as possible.
Playable at: gunner on itch.io
A Dino game.
---
You know, multiplayer ghosts. As a cohort.
I race first, then you whenever you can, then our third friend.
For tomorrow's track, we rotate.
Going first lets you leave bananas around, but going last means you get green shells to try to knock points off the leaders.
Bananas as shields, green shells as time-stops.
What to do when we're not in an active game jam?
A Dino game.
---
A Museum at the heart of Moon York City.
Full of exhibits.
Supporting Dino 's namesake (show me the bones!).
A Dino game.
---
An entry for the ludum dare jam 52.
Playable here: https://russmatney.itch.io/harvey
A Dino game.
---
I landed on 'HatBot' to name the entry for the Metroidvania Month (jam) 19.
Named after the main character, who runs around in a floppy mad hatter hat.
Also called: mvania19 (dino game) for the first half of the jam.
A Dino game.
---
A beatemup game idea I've been kicking around.
Elevator levels are one of my favorite things in games.
Tilesets should be automagic! But it takes some pre-work and some bitmask learning.
See also: TileSetTools script
A Dino game.
---
It's always a little surprise to me what notes exist already, and which don't.
This one did not, but has a big presence in my games journal.
---
Pluggs is a rusty bucket of wires, and he needs to escape the factory. He uses his plugs to control other devices, including humans.
Pluggs needs to avoid being detected. He can only control so many humans at once!
There's a gap in the godot ecosystem - how best to manage addons.
The recommended addon flow dodges the command line, which tells me it's targetting non coders. This makes sense from a whole team perspective - you don't want your tool to be inaccessible to artists and musicians who may not care to learn CLI basics.
But software engineering is all about dependencies and libraries. I want it to be easy to improve an addon that a game depends on (multiple games, probably) without fuss.
I've hacked this with symlinks before, but things broke when trying to get more users (or another of my machines) running the game. Then I added commands to make this 'easy' (just install java, clojure, and babashka, you artist, you!).
This led me to vendorize everything, which basically means don't .gitignore your addons, so your team members can download and run the game without fuss.
Lots of tradeoffs happening here, not sure the best solution yet.
For now, I'm working on all my games in a single project: a godot monorepo called dino. It's full of addons and games, and I can work on all of them in one place. The overhead then shifts to managing independent builds/exports/deploys, and so far that has been fairly smooth. We'll see where it breaks, but I think it's been excellent for my growth - I'm getting alot more done in less time, and getting to easily reuse and improve patterns as we go. That reuse/improve part of the cycle is important - most addons are not worth creating and isolating when you first have the idea, so giving them a chance to be consumed by multiple games shapes the public interface before I got sharing it elsewhere. Love me some monorepos!
A Dino game.
---
A runner game with a day/night cycle.
Collect items/platforms from rooms, move them around to solve the puzzle.
By day, learn the ropes and prepare for night fall.
By night, be-ware the dreams and ghosts that haunt the rooms.
Break the loop-spell to proceed in the game.
A Dino game.
---
Wordplay on tunic.
See also: Shirts and Skins
See also: shades (fun game item idea)
Maybe core: boomerang (game mechanic)
A Dino addon.
---
A dino addon for working with tilesets.
Expanded to include procedural generation magic.
A Dino game.
---
A small game, stemming from brainstorms related to ProtoMoon and other Moon Game Ideas.
The player finds themselves imprisoned on the moon, and works to escape, with the help of a mysterious benefactor.
A core mechanic involves disguising oneself using drops from guards.
A Dino game.
---
A new take on little red-riding hood, as a game.
Blowing up into a full brother's grimm fairy-tale adventure.
A Dino game.
---
A prototype to express some moon-game ideas.
Diving into this at some point led to Moon Trap.
I've amassed too many moon game ideas. This is one that will go in dino.
Related notes:
At this point, going to pursue the disguise mechanic and escape outline for the first version of this. Could come back later for more heisty, theify stuff.
A Dino addon.
---
I landed on Hood for all things HUD.
You can count on it to grow in some funky ways!
Next feature is likely a dev-and-player-facing DJ menu.
A Dino addon.
---
An in-memory game-state database.
Supports booking data from packedScenes and registering data from a nodes' _ready() function at runtime.
Will soon persist and pull saved-state data in at Hotel.register(self) time.
Built up with check_in/check_out as write/read function names.
---
Hotel was originally a Room manager, but it has grown into a full game state db.
It supports 'booking' data based on your static scenes, 'registering' nodes with the hotel when a node is _ready(), and 'checking-in' data as in-game events happen.
The main feature supports reloading zones and rooms that have already been visited, and restoring the state from the player's last visit. Ex: was this candle lit? What was this enemies health? Was this item already found?
Hotel as a UI view that can be used to access game data in a debug overlay or in the Godot editor.
Pulling data from your static files makes it simple to connect nodes together - the initial use-case for this was making it possible for teleporters (elevators) in different rooms/zones to reference eachother as a destination.
Hotel exposes a useful
Hotel.query({})
function as well, which supports several
basic keys (e.g.
groups
,
is_player
) and a general
"filter"
key for fetching whatever data you
need.
Hotel also offers a signal for all data
check_ins
,
which provides a nice separation of concerns for updating
the HUD or sending out notifications based on changed
data.
Related but not yet implemented: I hope to get to hotel themes soon, which is a step back toward the room management idea, but with a focus on data-driven or constraint-based look and feel (i.e. constraint-based room design ).
A genre I've not identified for myself until recently, but that I'm now seeing is at the core of it all!
I suppose you could instead say Roguelike.
Starting early today (12:01am)
working through clawe.org, pulling in some content, writing some new ideas
garden tending
A Dino game.
---
Playable at russmatney.itch.io/runner.
Includes a 'runner' api for playing and replaying rooms in a continuous direction.
A Dino addon.
---
Dino's camera code grew especially while working on tower jet (dino game).
See also: