dino (godot monorepo)

Created: Jul 22, 2022Published: Nov 01, 2022Last modified: Apr 25, 2023
Word count: 2208Backlinks: 59

A Godot monorepo full of games, addons, and scripts.

the name 'Dino'

  • Vaguely Flintstone-inspired (Fred's 'dog')
  • Trying to get at museums and exhibits (you know, dinosoar bones and all)
  • Sort of 'near' the word 'demo' (via jaro-distance?)

Status: Reasonably Stable?

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?

Games

The playable versions of these games are on my itch.io page: russmatney.itch.io.

They should all be playable via dino on itch.

> Demo Land

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.

> Ghost House

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.

> Cozy Gunner

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).

> Harvey

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.

> HatBot (dino game)

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.

> Pluggs Mcgee (dino game)

src/pluggs

Just a teaser - crawl around as a bucket of pluggs. More to come!

> Runner (dino game)

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!

>> The Park

src/runner/park

>> Prime

src/runner/prime

>> Gravity

src/runner/gravity

>> Guest Star

src/runner/gueststar

> Juicy Snake

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.

> Tower Jet

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?)

Future Games Ideas

> Moon something ( Moon Trap, ProtoMoon )

> Triage (dino game)

> hoodie

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 (dino addon)

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.

>> machine

A finite state machine implementation.

  • addons/beehive/machine.gd
  • transit() - move between states
  • addons/beehive/state.gd These state functions can refer to an actor, which is the machine's parent (i.e. the player/enemy/npc).
  • enter(opts)
  • process(opts)
  • physics_process(opts)
  • exit(opts)

> juicy camera (dino addon)

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.

>> features

>>> Points of Interest/Focus/Anchorage (POIs, POFs, POAs)

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

>>> trauma and noise-based camera shake

Also taken from Squirrel Eiserloh (SMU Guildhall) 's

Juicing Your Cameras with Math video: https://www.youtube.com/watch?v=tu-Qe66AvtY

>>> slow motion

>>> hitstop/freezeframe

A more exaggerated slow-motion.

>>> zoom (currently broken)

This needs a bit of love, as it's been broken since the POIs/POFs were introduced.

>>> offscreen indicators (partially implemented)

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.

>> Util.gd

Extensions to gdscript 's standard library.

>> Debug.gd

Pretty-printing dramatically speeds up log-reading (debugging) time!

It's also nice to re-use the pretty printing in various debug UIs.

>>> TODO add screenshots

>> DebugOverlay.gd

A dashboard with a few debugging helpers for displaying values on screen.

Better than logging to the console in some/most situations.

>> fonts

Some defaults for getting things going, plus some nicer ones too!

>> lights

Textures for providing basic lighting to scenes

> dj (dino plugin)

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.

> hood

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 ).

>> components

>>> ActionHint

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).

>>> Notifications, Hood.notify

addons/hood/Notifications.tscn

A simple way to throw some text on the screen and provide some feedback to the player.

>>> HeartsContainer/Icon

A Zelda-like health container that supports health as an integer from 0 to 6.

>>> Jumbotron

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.

>>> Quest

A rough prototype of a quest system.

Needs more love, not used much yet.

Likely getting it's own addon ( quest ).

> hotel (dino plugin)

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 ).

> metro (dino addon)

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.

> navi

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.

> reptile

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.

> thanks

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.

> trolley (dino addon)

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.

Future Addon Ideas

> shade

dino shader/tween helper addon

recently hit this word again, as a game/mechanic idea: shades

> vitriol

godot addon for vim style window navigation within godot

(escape as entrypoint, ace window style, plus global command/search bar)

> axe

an editor-level actions abstraction

(defcom+rofi for godot editor and game commands)

> kink (dino addon)

A wrapper providing a nice API into ink tools.

Systems and Abstractions

> Action Detector Abstraction (actions api)

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).

> Metro

Supports connected rooms in 2D map-based games.

Features:

  • activating/deactivating camera anchors
  • pausing/unpausing the current/adjacent rooms
  • outputting a grid/dimensions for building a minimap

> Runner Room

Support for building infinite runners.

> Hotel DB

Persisting and reloading game state across godot's node lifecycle.

> Dialogue

None! Hopefully something via ink soon.

> Gyms

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.

> Game.gd and DinoGame.gd

A DinoGame is a way for games to opt-in to some basic game management features (e.g. Player respawning).

bb tasks (helper scripts)

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.

> Aseprite file watcher + auto export

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.

> Godot game export

Building all of dino or one of its sub-games.

> AWS s3 web deploys

> itch.io deploys (via butler )

> run tests (via gut )

> symlinking to external addons (deprecated)

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).


Backlinks

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.

---

My entry for the godot wild jam #52

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

  • that's what I've done so far.

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 addon.

---

Tools for managing your AI.

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.

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.

Tilesets should be automagic! But it takes some pre-work and some bitmask learning.

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 addon.

---

A zone/room manager for Metroidvania and dungeon crawler games.

A Dino game.

---

Now we're talking - the Triage Dino Game page.

See also: triage

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:

A Dino addon.

---

One of the first Dino Addons, which manages navigation and scene managements.

Boils down to an autoload for Navi.nav_to(), and a few menu list components for creating main/pause/death/win menu screens.

Navi also maintains a scene history.

navi pause screen