carrotcake Blog 🍃

official devlog for carrotcake written by Louis Durrant

Thursday Report: Carving a path.

Posted on Dec 10, 2020

Development for The Garden Path has been gun-ho as we’re thick into December and the race is on to meet my personal goal of having the game ‘playable’ before 2021.

‘Playable’ has never in my heart meant ‘released’, but more so a state where the game can be enjoyed for what it is, ready for polish and filling with content. It’s difficult to draw a line for exactly how on-schedule I am. While originally the plan was for last year to focus on the game’s systems, and this year to focus on content, really 2020 has become something of a muddy middle ground—neither a good nor bad thing.

I always had a gut feeling the back-end development would prove itself to be a bigger beast than I anticipated, and while that’s been certainly true, it hasn’t been by nearly as much as I’d dreaded—and I feel as though I can see the top of the summit for the first time.

Really at this stage I’m ironing out the creases, with no huge jobs left on the roadmap, it’s a case of implement content, test and see, implement content, test and see. And, as each crease smooths out, it becomes much easier to block out content and plan for final assets.

And since so much of the game’s content is actually found within databases that already tally to entries in the thousands, it’s easy to forget just how much works out of the box while the box is still sealed shut.

But I shouldn’t get ahead of myself, there’s still a long way to go. Here’s a few points I’ve been working on since our last report.

Characters now more intelligently move around the garden through an ad-hoc pathfinding system and waypointing. This is crucial, as before characters would pick a random point on the map and move toward it—if an obstacle blocked their way, they would simply choose a different random point. Instead characters can now have a final and absolute destination in mind, and plot a route out ahead of time – if something blocks their way, they don’t change destination, they calculate a new route.

I did this by repeating two processes until the route it complete. First a ‘ghost’, an effigy of the character themselves, is fired like a bullet from the character toward the final destination – unless they’re stood in a huge empty field, the ghost will inevitably hit an obstacle. Once it does, the second process kicks in that I called ‘whiskers’. These are two feelers that rotate in opposite directions – clock wise and anticlockwise. Each whisker is racing to be the first to declare two points – at what point it is no longer colliding with the obstacle, and when it hits a second obstacle (or rotates without hitting anything for 180 degrees). The point between those two points is returned, the ghost then fires from that new spot, the character notes to move toward it, and the cycle continues.

The system isn’t perfect. While having two whiskers racing one another will help find the quickest way around an obstacle, it doesn’t necessarily result in the quickest route to the final destination. The logical step from there would be to calculate many multiple routes and compare their lengths. Fortunately this isn’t a MOBA, it’s a stop-and-smell-the-flowers type game, so I’m not too concerned for now. What’s important is that it feels like the characters have somewhere in mind to go, and in that regard it feels leaps-and-bounds better.

However I soon notice a critical error caused characters to bounce back and forth between two points. When testing the next angle to move around an obstacle from a new point, the previously losing whisker may find a gap sooner, meaning the character turns around and goes back the way they came. This had me stumped for a while, but the answer was fairly simple – so long as the obstacle remains the same, the losing whisker always sits out. That way, even if it’s not the most efficient route, the character will commit to it, be it moving around clockwise or anti-clockwise.

Characters are now (very often) weaving through trees like it’s nothing. It likely isn’t oven-ready for release, but I’m really happy with where it’s got me for a day or two’s work.

What isn’t being ‘built in a day’ are the acre designs. In accordance to my original idea of balancing purely RNG maps with predesigned maps, blocks of land called ‘acres’ and put together like puzzle pieces. While these acres in previous alphas have felt a little bit like random assets spewed over some grass, I really want to create something that feels like a believable and organic world.

What was originally meant to be done on a Sunday afternoon is still looming over me after two weeks. As it turns out, placing individual bracken. Fortunately, it’s pretty damn satisfying. With a lot of the assets complete and ready to drop in, it’s a bit like playing a version of The Sims where everything is something of my own creation. Finding interesting ways to combine rivers and cliffsides, rocks and waterfalls, as well as make each corner feel like it’s settled there for many years, or even carving out spots the player might choose to use as their hub, is a fun challenge.

And, with all these dense patches of foliage, I thought I’d take a break from map creation and actually see how it feels to move around them. As anticipated, the more flora the harder it is for the player to deliberately aim and select which flora they want to act on. While the existing action systems works fairly well, simply returning the prop that first collides with the player’s RayCast (streamlined with some context-sensitive prioritising), if the player couldn’t very deliberately choose one plant from many, then sense of control is lost.

A new focus mode, which I shared on social-media a week or so ago, was a quick implementation that has done wonders. By squeezing the Left Trigger, the player strafes and walks much slower and a small crosshair emits from the player to help select the object. The crosshair itself is just an Area2D moved with the joystick, returning only interactable areas of other objects. As Godot’s YSort puts the object with a higher Y value in front of those with a lower Y value, we can easily detect which object is visually in front of the other by comparing those values, and prioritise the one that seems closer.

My focus now is the new player experience. How is the player introduced to the game’s mechanics, and encouraged to discover what’s fun for them. How are each of the characters introduced, and how is everything paced. For a game based on real-time, just how much can the player do on the first day?

That will require finding a balance between keeping the player engaged, and keeping them excited for the days to come.

Follow me on Twitter, or maybe even Mastodon.