Engine Feedback :: An LD46 Postmortem

(Michael Burns) #1

Hi all, I had previously posted this on Discord and it was suggested I share these thoughts on the forum where they’ll be more discoverable. I’ve edited in some responses I got there which addressed (at least partially) a couple of the points so those resources are also discoverable.


The game: https://ldjam.com/events/ludum-dare/46/feed-it-grapes-keep-it-alive

What worked

  • ECS - overall model was flexible and enabled quick iteration, even though we weren’t familiar with the pattern and probably used it wrong
  • We were able to bootstrap a core game that had multiple, independent workflows after only 2-3 hours of effort, which was a massive boon to velocity
  • Music and sounds made the mood neat without significant effort
  • We didn’t really write bugs, since writing bugs is hard (once you figured out what the engine is doing)
    • ~2k LOC without any significant bughunts
  • Rust
    • Is good
    • Is safe
    • Is fast
    • Is pretty ergonomic
    • But maybe the &/mut placement is a little arcane for the novice

What didn’t work

  • Documentation lacks a good 10,000 foot overview of what the engine looks like
    • A picture of the overall architecture would have been a huge benefit
    • We ended up sort of strip mining the examples and reverse engineering them into artifacts that did what we wanted
  • UI wasn’t low friction
    • Positioning didn’t work well (in particular, hidpi)
    • Prefabs didn’t work well (and we didn’t know there was an alternative)
    • Unclear why this needs a separate input bundle? (Probably the separate EventReader after some more reading, but this isn’t apparent.)
    • System inclusion can be order-dependent
    • It took 6 hours to make a button using the tutorials
    • Apparently there’s a way to do this without prefabs, but this isn’t even mentioned in the documentation (the prefabs were also hard to find to copy)
  • Pathfinding
    • Graphs in Rust are nontrivial thanks to the borrow checker
    • Not complete at the end
    • Got it now, thanks to r4cppp (I’m out of links since this is my first post, but a search for “r4cppp graphs” will turn it up)
  • System-specific grossness
    • Didn’t compile cross-platform without manual changes to GFX backend
    • Apparently had other issues on OSX for… reasons
    • hidpi support was inconsistent even though logging implied it could be automatic
  • Audio API seems immature
    • No way to loop a sound? (Naive approach takes infinite memory.)
    • No way to do something when a stream ends?

Where things just got by, mostly by accident

  • The core gameplay wasn’t really the result of a plan so much as cutting scope and accidentally being fun
  • We learned Rust… sort of
    • The end product functioned
    • It definitely wasn’t idiomatic
    • But we had fun
  • Input
    • We didn’t have a method that homogenized all coordinates to world space before being handled; this should have happened in some wrapper for the input system
    • Saw something in the issues that suggested the engine can do this and this was just noob-ness


  • GameState’s’ ability to mutate GameData object makes the data access/mutation patterns unclear, which wasn’t obvious from the documentation