carrotcake.studio

official devlog

Thursday Report: The Groundwork

On Thursdays I write up a short report on my developments and thoughts if to do nothing more than keep myself accountable. Enjoy!

Last week I was up transferring my websites over to new hosting and briefly lost access to my email addresses, which wouldn’t be a problem if it weren’t for Medium’s unusual passwordless log-in system. So, oops! Plenty to dive into this week.

My priority over the last couple weeks was to improve on to the dialogue system. It’s still bare-bones, but I’m figuring out ways to make it more complex.

Previously, upon approaching an NPC and pressing the action button, the NPC will spout a single line, and the the dialogue would end.

My solution for adding multiple lines of dialogue was to convert the dialogue data into an array. An array is simply a series of strings (text) separated by a comma, where each string can be summoned by pointing to its number in the order it appears.

Then, all we do is +1 to the original number so the game knows to look to the next dialogue entry, in order. This would go on forever, though, so we need to find when the dialogue would end. For this, I conclude a line of dialogue with ‘END’, the game then checks if the word ‘END’ is in the current line. If it is, the word is hidden, and instead of continuing onto another line of dialogue, a signal is emitted to let both characters they are free to go on their merry way.

I like this system because it’s based on human language, and it’s simple.

Sounds scary!

In the future, for dialogue options, I’ll likely introduce a similar system, where if a line ends in ‘OPT’, or something similar, the game knows to pass the dialogue onto the player.

But this is all very static for now. NPC’s will always say the same line of dialogue. Eventually some selective database will need to be put in place to deliver a range of different lines to the player, and provide the player with dialogue options contextually.

That being said, this isn’t a conversation game. Listening, however, will play a large part. I’m hoping that a large part of my time working on this game will eventually be in the writing — what the characters say and express. Most dialogue options will be agree, disagree or say nothing. Options are important to keep the player engaged, and also feel as though the world is reacting to them. A little goes a very long way.

Concept for dialogue selection.

The above is just a concept at this stage. I like the idea of most UI elements feeling as though they’re floating within the world, and not on some abstracted plane on the user’s screen. Thought-bubbles play into this nicely. Perhaps using icons instead of text would give it a different feel. That’s something I’ll need to decide.

You may have also noticed in the GIF above — snow! In efforts to move the world building forward, I devised a new way of tiling the ground. A while ago I started building a tile-sheet of sprites — essentially a sheet small squares with slight differences that get drawn from and form the world. The two major issues with this is, first, blockiness — when you build a world from squares our minds can really sense the mathematics order of it, and things seem rigid. Secondly, is repetitive textures. Our brains are designed to see patterns, and it’s remarkable how puzzle-piece even the most random of textures can look when stepping back.

Instead, I’ve made a single large block of plain white that’s just larger than the average screen. On top of that sits a speckled texture that gives the ground that flowering, grassy feel. The texture overhangs, so that it merges with the blocks surrounding it. The result, even when zoomed out, is a ground that’s impressively seamless. But the best part is something I hadn’t considered — colour modulating!

Here’s the overlay atop the block.

Any texture that’s pure-white can be changed to any other colour through the engine. This means that, on the fly, both the colour of the ground and the overlay can be faded into a different tone dynamically.

With this we can have the grass reflect the seasons, snow cover, or anything else. I’m hoping to see if I can introduce this to tree foliage, to perhaps randomize the colours of each tree for variety, and have them gradually fade between seasonal colours.

This is ugly, but it demonstrates the point.

And just to finish us off, a new WIP animation for the old traveling gardener. He doesn’t have a name yet, despite much inner-deliberation. Turns out when a character has a cane you can’t animate them as you normally would.

This old man represents a time before the player arrives in the garden, and welcomes all fresh and exciting things to come.

*

Follow me on Twitter.

Thursday Report: The Conventional and the Non

I thought I’d use this report to look back at some of the design work I’ve done, particularly regarding characters.

Animals are always a fun way to capture certain characteristics that bring out a role. We all anticipate a way a monkey would act against, for example, how an owl would act — then we can take that further into the real world, how would a monkey lawyer conduct themselves compared to an owl lawyer?

It’s surprising how easy our minds allow the personification of animals. A monkey in a pinstripe suit doesn’t require much justification to be immediately believable, and there’s already a huge weight of traits we assume about him.

The task I had, then, was finding that balance. Riding on those assumptions too much and we have a cliche, steering away too far and things begin to feel ridiculous.

Let’s say we’re designing a scuba diving character. We might immediately start considering a penguin, maybe a seal, or perhaps even a dolphin that walks on its flippers. What if it was a blackbird? Why would a blackbird be going under water? Wouldn’t its feathers get wet? Suddenly we feel that sense of doubt, it could happen, but it’s a bit goofy — it’s trying to steer away from expectation. Why couldn’t it just be a penguin?

There are still roles I’m having a hard time deciding on, and maybe I’ll concede and choose the obvious. However, there are some characters I’ve settled on that I think were the perfect choices.

Constellations will play an important role in ‘Walled Gardens’. Players will need to discover which stars to connect with which to unlock certain bonuses. I needed a character that would provide that knowledge, and more, to the player. So — what animal would be looking to the stars?

Our aforementioned owl is the obvious choice. Maybe a bat could have been another. I settled on a heron. A bird known for standing very still by the riverside, it’s head often turned upward. And while nothing specifically is carried over from a heron to a night, or even astrological theme, here we have an animal known for its patience, observation and staunch neck — having a heron with a telescope in hand suddenly doesn’t seem so outlandish.

And what about a character known for digging, making tunnels? Our minds probably immediately go to a mole. While a pig might not be known for it’s digging underground — showing a pig character covered in mud and dirt is just what we’ve come to expect, so it doesn’t take such a leap of faith to give it a mining hat and a certain ‘can-do’ attitude.

Again, I still have a fair few more to consider, but hopefully this gives an insight into my designs.

Shying away from the conventional choice just gives everything that slight edge, it feels new and carries with it that bit of magic.

But, at the same time, not so unusual that it doesn’t feel familiar, and doesn’t feel at home.

‘Home’ is ultimately what I want to capture.

*

Follow me on Twitter.

Thursday Report: Digging Yourself a Hole

This week I was able to make a quick start on the landscaping that the player will do throughout the garden.

Although it’s only small, it’s great to see the systems for how the player might affect the garden after its generation. I decided to start with the trowel — it’s the only tool I’m absolutely sure on including, so it was a safe choice. It has a small form factor, and a many handy uses that the player might find themselves taking advantage of.

Maybe the traditional gaming shovel will make an appearance for those larger, deeper holes — although in a game where most gardening is planting seeds, would such a hole be necessary? Maybe a shovel would be used to remove a tree stump from the ground, but in the real world this would be arduous work. I like the idea of a tree having a real presence and sense of place, planting a tree shouldn’t be done frivolously, and neither should taking one down.

I haven’t yet figured out the best way to obscure the tip of the trowel to give the illusion it’s digging into the ground. I’m happy with the animation for the most part, it has rhythm and a good sense of weight and snappiness.

An easy way to establish a rhythm is to simply make sure each part of the animation plays out for the same time interval — or a division thereof. Watch the animation above, and you can count a consistent beat: 1, 2, 3!, as each motion lasts for exactly 0.2 seconds.

I would prefer if the player got on the knees — for the promotion of good posture! — , but that’s something I might have to figure out down the road, as it might involve swapping out sprites.

I still need to add the hands, and I’m still torn whether arms are a necessary inclusion — it would certainly make life a lot easier without having to flail those meat sticks around in animation.

While I originally had in mind to animate the dirt being dug up myself, it occurred to me that setting up a particle would be easier and offer many benefits. Some acceleration is added to the sprites and then a large amount of gravity is applied so they fall toward the ground. I randomized the size, the rotation, and the position of each piece. Now, every time the player will dig up the ground, the effect will look different with each dig.

The game creates a node with the image of the hole just below the player, and plays the particles as it appears. Just how many nodes can the player create before the engine collapses in on itself? Who knows! I’ll likely have to start removing holes when they’re off camera to keep things from spiraling out of control.

Next on the list to continue this will be for the player to fill in the hole after pressing the same button, or — of course — planting a seed.

*

Follow me on Twitter.

Thursday Report: RNG Trees

Every Thursday I write up a report on my latest developments and thoughts if to do nothing more than keep myself accountable. Enjoy!

I always knew I wanted some kind of random generation when it came to the game’s environment. To what exact extent, I’m still undecided. Currently I’m fond of the idea that there will be a number of large ‘parcels’ have predetermined features — certain elevation, certain water features etc. When a new game would be made, these parcels would be pieced together randomly, like a jigsaw with hundreds of different outcomes. I think this would give a good balance of random and predictable outcomes, which would make things more manageable but also fresh.

I’m still new at all this, so I’ve decided to start by building a ‘Spawn Sheet’. This is a sheet of many points, wherein each point rolls a digital dice. Depending on the number that lands, depends on what will be generated — a bush, a flower and so on. Then, once that’s been decided, another dice is rolled to determine whether this prop will spawn at all. I’ve called this ‘likelihood’ and I simply rank it from 1–100: 100 means it’s guaranteed to spawn, 1 and it will never spawn.

I can see this system getting out of hand very quickly since it’s so simple. Currently this spawns 1 of 4 outcomes, but once hundreds of different props are added to the game, I’ll need to figure out something more modular.

Having each point running it’s own code is probably a messy solution too. There will be thousands of points in a single game, so I’ll likely need to think of a way to generate each point through code, instead of plonking it down myself.

Still, I’m proud of delivering something that works at all. It’s exciting seeing the game do so much work for me already, and my main game scene is no longer filled with a hundred flower nodes that I’ve been having to sift through to find the player.

A small bit of code randomly shifts each point so there’s no obvious grid — things look more organic this way.

Eventually stricter rules will need to be in place. Certain zones might spawn more fir trees, for instance. Three bushes should never spawn directly on top of one another, for instance. That should come eventually.

‘Tellstone’ now has both placeholder walking animations. I originally envisioned his foot sprite swapping out for a version that shows the base of his foot, in front of his body. Godot doesn’t offer a super-easy way of swapping out sprites, or even showing and hiding certain sprites in its built in animation system, not without attaching code that triggers when a specific keyframe is played.

I’m actually very happy with the current animation without the foot coming up over his body. It’s surprising how much just shifting a still-sprite gives the illusion of weight and depth. I’m keen to return to the animation to give his backpack more of a clumsy heaviness, because it looks too rigid at the moment. He’s a comedic character, so I want that to come through in his animation.

Character’s now face the player when they talk to one another. This was far more simple than I anticipated — I simply deducted the character’s position from the player’s position. If the number is below 0, the character knows to turn to the left, and visa versa.

I decided that characters would always face forward when speaking. This not only simplifies the checks on where the player is standing, but also means all the fun expressions the characters will show won’t be lost to the player. It also doesn’t look as outlandish as I had worried.

Next week I’m hoping to make a solid start with the tools the player will use throughout the game, starting with the trowel, so that the player may dig small holes with which to place seeds in to cultivate their garden.

*

Follow me on Twitter.