Hello again! Back with another quick little update. Up front, yeah, I am making the bold and perhaps somewhat odd claim that an entire game can now be created inside of a pony's dialogue window. But before I talk about what that even means, let me first catch you up what's happened since last month.
As a reminder, subscribing as a premium patron will not charge you until the release of the first playable milestone build, which I am still trying to target as an April 2024 release.

Yeah so, last we spoke I was in the middle of figuring out how to generate villages. Now however, I'd say the technology is pretty much ready to do its job. In the above demonstration, you can see that it now develops a forest edge along the south side of your village, a little pond, and even a river system – which I'm not gonna lie, was kind of a pain to figure out. But now the generation understands what I think are all of the essential features of a village in Tales From the Herd, and it just needs a ton of assets and landmarks to spit out for you once you step off the train; which I'm sure is something that I'll be spending a lot of time on in the near future.

One of the first updates I made on here mentioned how I've added varying lengths to all manes and tails, which is a feature I've now brought over to the facial hair as well. Your pony can sport anything from scraggly stubble, to a full beard and mustache that puts even Cooper's to shame.
Another subject I showed interest in starting last month was how to handle time. Time passes in Tales From the Herd accurately to how it does in the real world; or at least, as accurately as your computer understands it. When you create a village, you will also be able to offset its time from your actual local time – e.g., a village that runs 6 hours ahead / behind. My reasoning is simple: I don't want any players to be stuck as the only pony awake in their village every time they play, just because they work nights or something. (Note that due to magical and unexplained nonsense, the passage of time will never be shown at Atlas Station, only in villages)
Time also affects ponies' memories, as it does our own in life. In its simplest form, this means saying "hi" to a pony for the first time during the day will slightly increase your bond, but likely not after you've said it for the 14th time. Memories are customizable pieces of data that can exist for mere seconds, days, or even literal decades. And their utility goes beyond just preventing a player from spamming "good morning" messages to boost a friendship...
By far my most complex feature in the game right now is dialogue, and nowhere in its systems do I have more pride than in something I call "Fancy Talk".
Imagine you're playing an adventure game. Maybe you name your hero "Linky" or something like that, idk. Then, when you're talking with the princess, you notice she actually says in her dialogue "Linky, you're the only one who can save us!". How did game devs get the character to say your name like?
I don't actually know, I'm still new at this. But the solution I came up with for my game is basically a way to talk to the code from inside a dialogue script. And it all begins with a square bracket, like so:
[name], you're the only one who can save us!
Normally, my dialogue simply spits out one character at a time, with no care or reason to perform any tasks beyond that. But when it encounters a [, it essentially stops everything, reads ahead until it finds a ], then sends whatever text it detected inside the brackets to be interpreted as a Fancy Talk Command. In the case of [name], it contacts the identity of the character that's being spoken to, finds their name, then returns that as normal text to be read in place of [name] – all in an instant. So the only thing the player ever sees, is:
Linky, you're the only one who can save us!
Now that isn't new, Fancy Talk has always been in my game in one form or another. What is new is just how complex these commands can be made. First is the fact that commands can now have parameters – for example, the command [redirect] doesn't actually do anything by itself. But if you type [redirect/4], then when the player clicks to go to the next piece of dialogue, they will be routed directly to line 4. And you can throw as many of these parameters in as the command will allow – [redirect/Intro/Quest Begin/4] will switch a character's dialogue script to line 4 of scene 'Quest Begin' in Act 'Intro'.

If you've played the demo and were especially astute, you might have noticed your responses never actually featured names, or italics, or other fancy dynamic info. Well that's because they sucked, and had no way of Talking Fancy. No longer true! Any commands I can write in a regular line of dialogue, can now also be written inside of a response.
One of the more powerful Fancy Talk commands I've added is a custom response. Like the name implies, triggering this will allow you to type quite literally anything you want, and your character will say it. Maybe you and your pony friend just discovered a new inspect species, and they insist on giving you the honor of naming it. With this new feature, you don't have to select from a limited pool of options, and instead can have whatever name or title tickles your fancy be made immortal in the memories of these characters.
At this point, I had squeezed all of the extra juice I had needed out of the Fancy Talk system, and was ready to move on. Instead of doing that, I added math operations and if statements to Fancy Talk – the building blocks of a programming language.
Let's meet a new pony to help us out with a little demonstration here:

Whoa! She sure seems eager to play a coin flipping game with us.

Here the joyous mare is explaining the rules of the game, but there's something else already cooking behind the scenes. You see a simple text explanation in the game, but this is what is actually written on her line:
Okay, I will flip a coin. If it's heads, I get a point. If it's tails, you get a point.
[remember/Coin Flip/My Score/0]
[remember/Coin Flip/Player Score/0]
Remember memories? Well, we're gonna create a couple of them here. [remember] is simply what starts the command, but /Coin Flip is the name of that memory. /My Score, then, is actually a sub-memory. And /0 is the data that that sub-memory contains. This can be either text or numbers, but here we're going to use it as what is essentially a variable. So, My Score = 0, and Player Score = 0.

Oh okay, and she imminently cheats. Let's take a look at how she did that:
Looks like it's [?/heads
[remember/Coin Flip/My Score/{{"remember"/Coin Flip/My Score}+1}]
/tails
[remember/Coin Flip/Player Score/{{"remember"/Coin Flip/Player Score}+1}]].
My score is ["remember"/Coin Flip/My Score], and yours is ["remember"/Coin Flip/Player Score].
Okay, so she's not actually cheating. I know there's a lot of crap in this line, but the fundamental is this: [?] will randomly print off one of its parameters. So if you write {?/yes/no], there's a 50% chance it'll say yes, and a 50% chance it'll say no. You can even write commands inside of those parameters, which will then only execute if the randomization selects to print that piece of text. So if the coin lands on heads, the game sets "My Score" to be My Score + 1, and if it lands tails, it sets "Player Score" to be Player Score + 1. This is synonymous to increasing either of those variables by 1.
Note that putting "" around the [remember] command will print the memory data, instead of just saving it.
Oh and those {} brackets? Pretty much the same thing as regular [] command brackets, but they're ran instantly, before all other commands. This way {{"remember"/Coin Flip/My Score}+1} translates into {0+1} and then finally 1 before the memory is saved.

You can flip this coin as many times as you like, and it'll keep adding to each player's score. All without a single line of code... technically.
I mentioned a bit ago that Fancy Talk can now also understand if statements. If you're unaware, the premise behind these are simple: if a condition is met, then do something. If player presses space bar, make their character jump. If player's health is less than 0, give them a game over. You know, that kind of stuff.
Combining all of the above techniques, and a couple if statements to round things off, I have assembled a simple RPG demonstration entirely inside of the game's dialogue.

And RPG Mare even has the same barber as Coin Flip Mare! She asks us to name our character, and we can do just that with the new [custom response] command. Once done there, she starts asking us to spend some talent points on our character, likely a familiar concept to us gamers.

I'm gonna go for that sort of thought-deficient barbarian stereotype, and stack most of my points into strength. The key thing to know here is that every time I choose an option and RPG Mare adds a point to one of those stats (which again, are just memories), she's also quietly taking away from our spare points to spend. Here's what the raw line looks like when I choose strength:
[!/RPG/Player Talent Points/{{"!"/RPG/Player Talent Points}-1}]
[!/RPG/Player STR/{{"!"/RPG/Player STR}+1}]
Sweet, now your character has ["!"/RPG/Player STR] strength.
[if/{{"!"/RPG/Player Talent Points}<1}/[redirect/5]]
(For convenience, [remember] can also be written as [!].)
While all we see as players is:
Sweet, now your character has 7 strength.
And that little [if] statement at the bottom? Once it detects that our spare talent points to spend have reached 0, it executes the command [redirect/5], and sends us to a new dialogue window. This is where, naturally, our character fights a large sewer rat.

The rat has its own stats that RPG Mare silently established, and that are then used here in a comparison against our character's character's stats. The two trade vicious blows, as wonderfully narrated by our friend, and a victor is determined.

(It was me).
So. It's okay. You can ask the question...
Well I do think dialogue will be one of the strongest pillars of the Tales From the Herd experience, and bolstering it with future-proof capabilities can help me weave that experience without having to stop and give it new abilities constantly down the line. Furthermore, I've already used many of its new features, as getting yourself set up with a village is as simple as having a conversation with somepony who oversees that task. You can type custom responses to give your village a name, or enter a specific seed. And the details you give are saved to a memory, which is then fed into a script that can turn that information into a real place.
But, also, if I was to be completely honest: I also just got kinda hooked. I wanted to see how far I could push this stuff. I guess that's a double-edged sword in terms of working solo: I do whatever I want to with this game, but I'm also not reigned in perhaps when I need to be.
That was a lot of text! A weird tl;dr blog post, and I do not expect you or anyone else to read all of it, but know this: work on Tales From the Herd continues to be one of my biggest focuses. With all of that nonsense coding, and coding inside of code from this month, I think it's high time to make my next task more art-related. In February, I expect to be working on the pieces of the village itself, and start to bring it all together!
Thanks for sticking with me!
Zv'n
2024-02-13 03:32:12 +0000 UTCCryghast
2024-02-13 03:27:53 +0000 UTCZv'n
2024-02-01 18:47:23 +0000 UTCLady Nessie
2024-02-01 18:29:05 +0000 UTC