Iron ChIF: Pilot Episode (Pacian vs. Draconis, using Dialog)

That’s not entirely unintentional, truth be told! Whether intentional or not, a lot of English-speaking mid-20th-century sci-fi and fantasy authors (now that’s a big pile of adjectives) leaned on Eastern European aesthetics for their spooky, mysterious, or villainous names. Now that’s become a common convention in the genre.

None of these sounds are especially Slavic on their own, but writing the Z sound as “z” (instead of as “s”) and the ZH[1] sound as “zh” (instead of as “j” or “si”, like in French jeu or English vision) distinctly is. Same for combinations like “zr”.

The “gh” and “q”, on the other hand, reflect a more recent approach to spooky/mysterious/villainous names in sci-fi/fantasy, drawing on Middle Eastern languages, especially Arabic. I’m not planning to have this language be especially villainous, but the aesthetic of “English-speakers frequently see names in this language, so they’re used to how the letters sound, but it’s still clearly Mysterious and Foreign” is one I’m deliberately trying to evoke.

There’s definitely some historical fear of the Other underlying the convention, which is Not Great. But right now, it provides a convenient genre trope I can tap into to set the mood.


  1. /ʒ/ ↩︎

12 Likes

Ah! Clever craftmanship at its finest! Never make what you can steal!

Mind you, I say “stealing” with the utmost respect. Many of the oldest myths of mankind are about cunning clever deceitful thieves…
Indeed, recognising tools or treasures which will further your own objectives is a very valuable and powerful skill! Taking what is useful, even only tangentially, making it your own and leveraging its power in service of your own needs.

@Draconis, I applaud your cunning!


Now I look expectantly to @Pacian, whose Spider of Interdimensional Shenanigans is lurking somewhere in the cloak-pockets of a Goblin-thief who’s having trouble understanding the voice-activated interface of a looming vending machine in a cave while his three heroic friends are trying to tickle each other’s thingy with the feather some flying thing found in the drawer …

Wait… I’d better go reread those posts. I fear I took a wrong turn there somewhere…

11 Likes

I think it’s about time to introduce our cast of characters - the wonderful heroes (and detestable stranger) who sprang to life even before I properly knew what I wanted to do with them…

> me
Fairies are common in this part of the world, it’s true, but you are by far the cleverest and most beautiful of them all.

Now, you are well aware that every other fairy you have ever met also thinks the same of herself, but it’s a simple fact that only one of you can be correct, and that one happens to be you.

> trala
You expect that the humans whisper of giants in Trala’s bloodline. Perhaps that explains her height and breadth, but you know that her incredible strength is the result of a relentless training regimen that she keeps up in every spare moment.

Your tiny heart wants nothing more than to be Trala’s loyal sidekick on countless dangerous adventures, but she’s so big and tough that even landing on her muscled bicep - even giving it a good kick - she doesn’t notice you at all!

(And now your foot hurts.)

> lind
Lind’s pointed ears and breathtaking beauty speak of a lingering heritage from the ancients, even before you get to the healing magic he uses to keep Trala in the fight.

As soon as you first laid eyes on him, you knew that he was destined to fall obsessively in love with you and die of a broken heart, so once again you flutter enticingly into his gaze. But, when he swats you away like an annoying insect, you are reminded that this poor, proud man is concealing his abysmal eyesight from his companions.

> stranger
You loop around the stranger at a safe distance, taking care not to tangle up the silver thread of silk that tethers you to him. He’s bundled up in a big overcoat and broad-brimmed hat, with his face covered by a scarf and goggles. It’s transparent to you exactly what he is, but the humans seem oblivious.

He dotes over an exotic gadget.

During my lunch hour I spent some time scribbling ideas in my notebook, trying to plan out the whole game from start to end.


Sadly, someone appears to have crossed out all the most important spoilers!

Now as my first task of the evening, I’ve gone through the standard library from top to bottom. Where a verb can easily be disabled, I’ve added an in-character refusal:

%% READ <obj>

(grammar [read [object]] for [read $])

(prevent [read $])
	Fairies are too clever to need to read!

Where it’s seemed like it might be complicated to disable a verb, I just deleted it:

Screenshot of a git commit showing almost 1200 lines deleted from stdlib.dg.

From this baseline, I just need to make the whole damn game!

15 Likes

Ah! A small wisp of @Pacian’s creative steam-cloud of loosely connected ideas spewing from under the lid of his pot condenses into recognisable concepts: characters!

And a jolly lot they seem! And also, just like I mentioned in my first response to the loose notes: a lot of depth crammed into a seemingly small bit of text: this time the character descriptions.

The fairy PC certainly seems inescapably infatuated with both Trala and Lind. But the mysterious silken tether binding her to the Stranger suggests that her loyalties lie with this being, suggests further that the bond is perhaps involuntary or decreed by a higher force…

After the elaborate character descriptions, with their (very subjectively coloured by the fairy’s biases) physical details and hints of their roles in the story to come, that last line in the Stranger’s text packs quite the punch.

He dotes over an exotic gadget.

Almost screaming “Enough with the pretty words already. This is what’s important!”

I’m very curious what’s cooking under that lid…

6 Likes

The interdimensional spider thing had me thinking along an insectoid track and I was wondering if the PC might be some sort of a flying bug, but no, here we’ve got a fairy! I also admit to having initially expected more of a science fiction flavor originally; obviously once the goblins and whatnot came into it there was clearly a fantasy element, but this is more high fantasy–leaning than I anticipated.

Characters have always been one of Pacian’s strong suits, so it’s exciting to get a first glance at them here. A tiny fairy with an outsized attitude and a frustrated affection for a human who doesn’t notice (or two, as the case may be!) naturally puts one in mind of Tinkerbell(e) from Peter Pan, and I’m also a bit reminded of Pacian’s own Princess Cathabel X, the rather bratty narrator of Forsaken Denizen. But there’s an interesting wrinkle here with the fairy PC’s apparent captivity, kept on a leash by this mysterious stranger who seems to be up to no good. I wonder if the focus of the game may be on figuring out how to help Trala and Lind without alerting the stranger to what you’re up to?

9 Likes

One of the best things about Chants of Sennaar is its interface. It makes it very easy to supply tentative translations for each word, which are then displayed every time you see the alien text. If this language puzzle is going to work, I need a similarly frictionless interface.

Well, I’m not going to be using hyperlinks for game input this time—not many verbs will be effective in solving puzzles, but figuring out which verbs those are is most of the puzzle! So maybe I can use the hyperlinks for this. To avoid spoiling any of the puzzles, this involves objects and words that are not in the game itself—purely for demonstration purposes.

And thanks to those access predicates from before, I can keep track of exactly which objects each word appears on, without any runtime calculations or tedious manual encoding!

18 Likes

Welp, there you go, pack it all up, I’m done! Or… not really.

My plan has been to start at the end and work backwards, so I can cut loose if I start running out of time… But actually, there are so many dependencies for the actions the player has to take that working backwards feels like it’s taking extra time to get my head around.

I think to some extent this is because I’m making much more normal text adventure puzzles than I usually would for a game. Like, look how normal this is:

> square
A clever fairy like you knows what a square is! It’s a flat shape with corners. Yes: this is a square in the floor.

The stranger points his gadget at the square and it chirps melodiously. He walks over and scrabbles at the square with his hands. Stupid stranger! You can’t pick up a flat shape!

> whosit
A brass object about the same size as you. Definitely a whosit.

The stranger points his gadget at the whosit. It makes a short, cheerful noise like “chu”. The stranger puts the doohickey in his pocket and picks up the whosit.

> square
A clever fairy like you knows what a square is! It’s a flat shape with corners. Yes: this is a square in the floor.

The stranger points his gadget at the square and it chirps melodiously. He walks over and inserts the whosit into the square before lifting it up. You are confounded! If it’s lifted up, is it still flat? Is it no longer a square?!

In the square are a dingus and a doojigger.

I’m finding it difficult to judge how much of the game is actually done and how much is left to do…

Hopefully there’s three evening’s-worth of work left, because that’s what I’ve got!

14 Likes

The groundbreaking and, in this context, inevitable The Gostak by Carl Muckenhoupt, and also the nonsensical (or is it?) poem Jabberwocky by Lewis Carrol have been looming large in my mind since the challenge ingredient for this show has been revealed. Both are full of incomprehensible words. But both of them have this in common: they’re full of English incomprehensible words. The nonsense words are embedded in English syntax, and they are for the most part easily readable with an English pronunciation, which also means we have an intuitive grasp of the spelling, however slight. Even more importantly, the nonsense in Jabberwocky and The Gostak, by virtue of being recognisably English, always has the feeling of an inherent meaning just outside our grasp.

This leads me to something that has been worrying me about translation puzzles, especially the one @Draconis is working on. The Eastern European-leaning spelling generated by their program produces difficulties in pronunciation, readability, and, not unimportant for a parser game, typability!

I do know that Draconis’ Stage Fright (EctoComp 2025), and The Wise-Woman’s Dog (IFComp 2025) (to name the most recent) utilise a powerful hybrid interface that allows all input to be given through clicking hyperlinks. Draconis, on the other hand, also knows from my transcripts of those two games that I for one strongly prefer to type my way through a parser game.

Now, I have no difficulty typing “DISTIM DOSHES” once I’ve encountered those words in the text once or twice. Similarly, the “borogoves” and “slithy toves” from Jabberwocky pose no problem when it comes to intuit their spelling from their pronunciation. These words, nonsensical though they may be, feel natural to someone familiar with conventions in the English language. The sometimes utterly illogical nature of the connection of sounds to letters in English (about which many funny videos can be found floating around online) notwithstanding, there’s a spontaneous connection between the sound of these words, their spelling, and the ease with which they can be remembered and typed quickly without having to check the source every two letters.

But keeping the word-image of “zhozregrua” or “vozrazalio” in my working memory long enough to type them fluently and without error would pose a considerable problem!

So I was already resigned to extensive use of the hyperlink features of Dialog in playing Draconis’ offering. And then I read this:

Fortunately, they go on to propose a much more fine-tuned function for the mouseclick interface: building a dictionary!

I like this feature a lot, and I’m convinced Draconis can squeeze every bit of player-friendliness out of it.



Jabberwocky

'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogoves,
And the mome raths outgrabe.

"Beware the Jabberwock, my son!
The jaws that bite, the claws that catch!
Beware the Jubjub bird, and shun
The frumious Bandersnatch!"

He took his vorpal sword in hand:
Long time the manxome foe he sought—
So rested he by the Tumtum tree,
And stood awhile in thought.

And as in uffish thought he stood,
The Jabberwock, with eyes of flame,
Came whiffling through the tulgey wood,
And burbled as it came!

One, two! One, two! And through and through
The vorpal blade went snicker-snack!
He left it dead, and with its head
He went galumphing back.

"And hast thou slain the Jabberwock?
Come to my arms, my beamish boy!
O frabjous day! Callooh! Callay!"
He chortled in his joy.

'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogoves,
And the mome raths outgrabe.

from Through the Looking-Glass, and
What Alice Found There
(1871)

9 Likes

>AMUSING

5 Likes

A lot has happened in Keyboard Stadium since I went to bed in my Australian time zone.

For one thing, @rovarsson has been pushing the mixture of metaphor and senses to necessarily eye-watering levels. It turns out ‘poledwiczki volove’ is not a Polish author of renown.

Now to Draconis’s reveal of access predicates:

My sense from Draconis’s description was that this code (which was impressively short, reminding me of Pacian’s original favourable assessment of Dialog’s succinctness in his interview) is an efficient way to have his game auto-index various data relationships. Draconis stressed ‘at compile-time, like here’ but when they referred to cases from other games – e.g.

– those gave an impression of being dynamic in-game calculations. So I’m not sure I have got the right end of the stick, and I certainly don’t understand the code.

FUKUI-SAN! OH FUKUI-SAN! (@improvmonster ) Might you be able to talk us through these things?

-Wade

7 Likes

In the minority corner here, I don’t use hyperlinks unless I have to. One of the main reasons I like parsers is that typing things out makes me think.

I’m thrilled about having to figure out what verbs to use.

It’s like renovating a house, ya? You’re done when you run out of money and patience. Games are done when you run out of time and give-a-shit.

Just finished playing Pacian’s Weird City Interloper and enjoyed it thoroughly. I loved the limited parser mechanism although I found it did lead to a lot of lawnmowering that sometimes undercut the wonderful story the game was telling. Still, that was my only issue with the game, and the way it nudged me into slowly learned about the world, the characters, and myself was highly satisfying. Very high fantasy concept game, and it looks as if our cake at the end of the week will follow this pattern. And it is fairy cake! Mmmmm. Fairies. Clever ones. Delicious. I bet we’ll see sugared fairy wings decorating the cake.

Tomorrow I start The Wise-Woman’s Dog. Everyone who hasn’t played it should play along with me.

12 Likes

----giddily hopping from one leg to the other----

What a treat you’re in for!

I should really play Pacian’s Weird City Interloper, but I already have too many pots on the stove. EctoComp is still cooking, you see, and I want to bite a big chunk out of those meaty bloody offerings too.

So I’ll wait until the kitchen cools off a little and then savour WCI more leisurely.

8 Likes

i was afraid you’d ask…

i knew this point would come. draconis has the gift of taking whatever tools are available to him, twisting and contorting them, squeezing every shred of utility out of them, and cutting away all possible extraneous superfluity, until us dialog mortals are left slack-jawed and glassy-eyed re-reading through lines of code over and over.

i don’t know much (anything?) about plists but wikipedia says they’re a way to store data using key-value pairing. this code:

(plist [$ $ | $rest] key $query has value $result)
    (plist $rest key $query has value $result)

(plist [$query $ | $rest] without $query is $result)
    (plist $rest without $query is $result)
(plist [$k $v | $rest] without $query is [$k $v | $result])
    (plist $rest without $query is $result)
(plist [] without $ is [])

(plist $plist with $k updated to $v is $result)
    (plist $plist without $k is $removed)
    ($result = [$k $v | $removed])

allows for manipulating these lists in three different ways. it’s kind of hard to parse without seeing how the underlying data is set up.

as for this:

@($Obj reads $Inscription)
	($Obj has text $Inscription)
	(word assigner $Obj $Inscription)

@(word assigner $ [])
@(word assigner $Obj [$Head|$Rest])
	($Obj bears $Head)
	(alien word $Head)
	(word assigner $Obj $Rest)

access predicates (the stuff preceded by @) are kind of like macros. the part at the bottom @(word assigner) sets this up as a predicate that takes a list (apparently of inscripted vocabulary words) and recursively assigns them alien words.

when the ($Obj reads inscription) predicate (itself an access predicate, holy crap) uses the (word assigner…) predicate, the compiler will ‘unpack’ all that stuff at the bottom at compile time.

a more mundane (read, less mind-blowing) use of access predicates might be shortcutting something like checking if an object is both animate and female.

@($NPC is female)
     (animate $NPC) 
     (female $NPC)

this will ‘unpack’ at compile time allowing you to use just the query without repeating all the rest. you can also do the reverse and use it to “turn” an object into an animate female.

(now) (#theToaster is female) 

will automatically “expand” to:

(now) (animate #theToaster)
(now) (female #theToaster)

does anybody know if fukui-san is a drinker? i could use one.

10 Likes

Thank you fukuisan! I will give myself time to digest what you’ve said.

I think this is a very important point for us all.

The Iron CHIF’s mastery of the Dialog language is a challenge to the Dialog technical advisor.

Therefore I don’t see Pacian undercutting Draconis overall with tech prowess. However, we judges will be rating the dishes in many dimensions!

Also, though we will see much code on the way, we won’t be privy to the entire code during the competition. Nor, even if were fully privy to it, would we fully understand it, as I think is plain by now :grinning_face_with_smiling_eyes:

EDIT - An additional also, though we judges seek to be persuaders, commentators and elucidators, the final arbiters of the winner are you, the audience, with your votes after the tasting stage.

As a random onlooker once said of IFComp, ‘It’s an IF competition, not a programming competition,’ even though the two poles (and three when you add writing) can become inextricably linked in IF creation.

So all the elements are churning. Strong tech prowess under pressure, and as I will discuss in my next dissemblage when I return my gaze to Pacian, strong writing under pressure…

-Wade

10 Likes

Pacian has demonstrated further showmanship in teasing more notebook stuff but also hiding some of it -

I squinted my hardest, but it was like the scene in the American release of Kubrick’s Eyes Wide Shut in which masked people sit or stand in front of anything too saucy.

What interested me in the new prose snippets from Pacian was the amount of characterisation opened up in a small word count. For example -

Here we get Lind’s race, aesthetics, abilities, character of pride, and relationship to the narrator. We get a measure of the narrator’s perceptiveness (strong) and what they have perceived about Lind. And there’s a vector set up where Lind has bad eyesight and it’s mostly only the narrator who’s aware of it, which is both an emotional thing and a practical thing, and a narrator issue (who knows what about whom, and when?). So that is a ton, written with great mobility and rhythm.

In a lot of parser games, this kind of thing (writing like a normal writer!) can be trouble-making, because more nouns can demand exponentially more implementation. This is where we see the benefits of a limited parser, a Pacian specialty.

If you take away a ton of the grammar mechanics, players can’t do certain things and then don’t expect to, or expect to have to, and the focus goes to whatever the author wants to put the focus on. So it can be a great strategy for certain kinds of concentrated material, or short to mid duration games.

To play devil’s advocate (and perhaps being slightly jealous as I am a Big Parser type of guy and that’s why my WIP has been going for years not days) limited parser games can be lawnmowery (a quality also touched upon by @AmandaB earlier) or land a bit simply. Simplicity in general is in favour at the time of this inaugural Iron CHIF, though. I think it’s broadly come into fashion via the arrival, over time, of choice games in all IF events, of which a much higher proportion will be simple.

But that’s just musing on the zeitgeist from the judge’s box. A limited parser is a design choice, as is a full one, and whichever one you pick, you work with it.

What I see is that Pacian can very strongly exploit his writing prowess in the context of a limited parser game, getting maximum flavour into his dish in the short amount of time on offer in Keyboard Stadium. This kind of writing is a weaker area for Draconis by their own admission. Let’s not overplay this, though! You don’t acquire all of Draconis’s plaudits if you aren’t a good writer. The writing and programming need to flow together to create the meaning of IF, and Draconis very clearly knows how to achieve that flow.

-Wade

9 Likes

Oh, exciting, now we’re getting a first taste of the puzzle mechanics for both the Iron ChIF and the challenger!

Draconis’s translation interface is looking very smooth and easy to use; I especially like the list telling you where you’ve seen this word before. I haven’t gotten around to Chants of Sennaar yet, but the mechanic reminds me a little of how the translations work in Heaven’s Vault, which I love.

Meanwhile, Pacian’s game has a much more standard medium-dry-goods aspect to it—which, as he notes, is unusual for him!—but figuring out what the whosits and dinguses all are will probably spice it up a little. And what of that mysterious device?

8 Likes

OK, I suppose now that I’ve wittered on about myths and metaphors and my favorite Star Trek movie, I should look at some of the actual code our chefs have been offering, the rebar that undergirds these cloud-castle edifices they’re building in the skies? Friends, I am a mediocre at best in Inform, and nothing at all in anything else – and I’m catching up after a day juggling work and a sick toddler – so I’d accept any sympathy you direct my way.

At least @Pacian is starting out reasonably, fortified as I am by @improvmonster’s lectures. Beyond the stranger fiddling about with its pockets, we get our initial (and sole, I believe) location:

Others have picked through the substance here – like Amanda, I’m intrigued that we seem to be leaning more towards fantasy than sci-fi, given the setup – and the one of… stopping formulation is familiar enough to me (including jamming code in there, though Inform’s habit of expanding texts before printing them can make this dangerous), but what I’m interested in here is nothing. Or rather, the textual representation of nothing, which is to say, white space. Wrangling line breaks is the bane of many a parser-coder in Inform, and I believe it can be a headache in TADS too, but I’ve heard Dialog authors sing its praises on this score, so I’m trying to glean what I can about how it handles this vexed problem. I’m not seeing much different yet, with (par) seeming to indicate a standard paragraph break, and things like (a $obj) looking like they sub in a variable name, which are both familiar enough approaches from Inform.

As things get more esoteric, perhaps we’ll see how Dialog makes things more manageable for its authors on this front – or if not, I’ll probably ask Fukuisan for a mini-lecture, though I’ll wait until his head stops spinning from the workout our Iron ChIF has been putting him through!

Funnily enough, I’ve been starting to read The Hobbit to the aforementioned sick toddler – he’s too young for it, but he’s interested enough to listen and then it knocks him right out, so I’m calling that a big win – so this is an enticing question indeed. Our challenger being a bit coy about what the stranger might be holding there to start, so I can’t help but wonder whether it’s the device about which our meals are being constructed, or something else entirely?

I appreciate the baby steps Pacian is offering us, because despite @Draconis kindly offering explanations alongside their code, I’m barely making heads or tails of it (and that only because of @improvmonster’s run-down on list management!)

So I think this is basically cramming a text in the alien language onto an object, and setting up the world-state so each word is associated with the object (“bears”) and flagging that these words are in the alien language, not English, without having to manually run through the process each time? I’m not sure whether this is all being done in setup, though, or it indicates that the player will be able to inscribe some texts, too (I think not, but otherwise, wouldn’t this all be done at compile-time anyway?)

The above probably doesn’t make any sense and is why I try to confine my commentary to the non-crunchy parts of IF!

The stuff about the dictionary is way, way above my pay-grade, though the fact that we’ll be able to dynamically set a translation of the alien language is pretty encouraging to me – I know other language games, like Heaven’s Vault, have this as a feature, but all the IF implementations I’m aware of just require the player to keep and update the dictionary. This mechanic seems like it could be very powerful and lend the gameplay a distinct feel, as well as allowing the puzzles to be more complex as the player won’t need to store as much in their head. But one detail of the implementation did jump out at me:

This hearkens back to the white-space question I raised above – it seems as though variable names come through with spaces around them by default, but you can modify that behavior with this (no space) syntax? I can definitely see the advantages to such a feature, especially if there’s a (for the love of god don’t put a line break here) analogue.

All right, that’s our competitors’ daily updates sorted, so now it’s off to bed!

…what do you mean they both made double updates?!

11 Likes

Yep! A plist is just a list that goes [key1 value1 key2 value2 key3 value3 ...] in order to represent a dictionary. And Dialog is so good at manipulating lists that we can get all the normal dictionary operations we could want, in just ten lines of code!

First, (plist $ key $ has value $) looks up the value corresponding to a particular key. (Bonus: if you use this as a multi-dict, a multi-query will get you every value corresponding to it!)

Second, (plist $ without $ is $) removes a key from the dictionary completely.

And finally, (plist $ with $ updated to $ is $) first removes a key, then inserts that key again with a new value. In other words, this is our update operation.

These three operations are all O(n), while adding a new key is O(1), which isn’t great efficiency (something like Python can do them all in O(1)!), but it’s not terrible either. On the order of magnitude we’re talking about, there’s no noticeable delay.

The benefit of plists, then, is you can stick 'em in global variables and update them when needed. In Wise-Woman’s Dog, a plist mapped recipients to a number of goats; in Stage Fright, it mapped staked objects to the number of turns left on their timer; and now in this competition, it maps alien words to lists of human words (probably English, but who knows?) supplied by the player.

(Plists were probably not the right tool for the job in Stage Fright, because at most two things can be staked at a time. But I couldn’t see a better solution and I was under time pressure, so plists were Good Enough.)

Exactly! Access predicates are macros that expand to their contents during compilation. Everyone who’s coded in Dialog has probably used one:

@($Obj is $Rel $Parent)
	*($Obj has parent $Parent)
	*($Obj has relation $Rel)

This means that (#dog is #in #car) actually expands to (#dog has parent #car) (#dog has relation #in). But this expansion can happen anywhere: as a top-level rule (declaring the initial state of the world), as a query (checking that state), or as a (now) statement (updating that state). This means the main use for access predicates is to create aliases for properties and flags, like making ($Obj is closed) mean ~($Obj is open).

But

There’s also a significantly MORE powerful use of access predicates, which I believe nobody except Linus has ever used, and then only for one purpose in the standard library. This is how rules for (grammar $ for $) are converted into an efficient form for the parser.

Because you see, access predicates can match literal values at compile-time. Only literals—objects, numbers, dictionary words, and list literals—but that’s still immensely powerful. It means that:

(word assigner #tablet [ejebro ghazeva qroghod])

Is converted at compile-time into:

(#tablet bears @ejebro)
(word assigner #tablet [ghazeva qroghod])

Which is converted into:

(#tablet bears @ejebro)
(#tablet bears @ghazeva)
(word assigner #tablet [qroghod])

And finally:

(#tablet bears @ejebro)
(#tablet bears @ghazeva)
(#tablet bears @qroghod)

In other words, I can declare a rule like (tablet reads [ejebro ghazeva qroghod]), and have the compiler convert it automatically into:

(#tablet has text [ejebro ghazeva qroghod])
(#tablet bears @ejebro)
(#tablet bears @ghazeva)
(#tablet bears @qroghod)

The first rule here is then used in the game to actually print the inscription when you examine an object, while the other three are used to establish a relation between objects and words, that I can then query to determine which objects a certain word appears on! Since all the heavy lifting is done at compile-time, I can very efficiently search up (for example) a list of all words that appear on examined objects, without having to do any list searches at run-time.

I’m pretty sure Linus built this feature into the compiler specifically to implement the (grammar $ for $) system in pure library code, and I don’t know if it’s ever been touched by anyone who hasn’t dug deep into the guts of the compiler to figure out what’s going on. But if part of this competition is to show off the power of Dialog, I’m going to pull out the deep esoteric lore!

If my esteemed competitor is going to make double updates, then clearly I need to make triple ones!

14 Likes

(Actually, @Pacian had three formal updates today, but I’ll bracket his two subsequent ones together)

I’m liking this cast of characters, though of course the fairy themself is the best one (just ask them). I’ll note that my fellow judges seem to think we’ll be nursing a crush on Lind, but I’m not sure his infatuation is mutual, we might just by fluttering our eyelashes as we flutter by because we can’t let a good prophecy hang about unfulfilled.

The scribbled picture of the Sanctum is also helping me get a better grounding on where our challenger is headed; I see the crooked desk as well as a chest, an altar with a sort of focusing stand for a mirror or lens in front of it, and – a dunce cap, maybe? That cone is stymying me, but between the visuals and the progression of engineering tasks outlined in the subsequent chart, there’s plenty of fodder here for an escalating series of challenges, so long as those noisome goblins give us enough time to putter about (hopefully Pacian isn’t planning on relying too heavily on eau du orc for the flavoring!)

We’re starting to get some gameplay hints in the excerpts, too:

So those noises seem like they might function as instructions to the stranger, with successful results sometimes turning on what the stranger’s carrying? But in addition to figuring out what the beeping means, the player also seems like they might have to create a running translation for ordinary-English words like “dingus” and “doojigger”, which might be the harder task (at least if a dinglehopper shows up, we’ll know it’s a fork) – and with the fairy, the stranger, and Trala and Lind all assigned to different behavior as things progress, there are plenty of ingredients here for an out-of-control farce!

Meanwhile, on the Iron ChIF’s side of Keyboard Stadium:

This is a masterful stroke, because in the back of my mind I’ve considering whether one reason the tentative-translation mechanic I mentioned before hasn’t shown up in previous parser games involving language is that typing TRANSLATE FNARGLESZHARFCK AS DOOR would drive the typo-prone to distraction; leveraging one of Dialog’s most powerful built-in assets to keep the opened-up gameplay space manageable for the player is a lovely bit of design (assuming, of course, that it winds up working).

These tablet examples also make some of @Draconis’s earlier fiddling clearer – the player will know which words came from which objects, so that inscription-assigning macro helps set all that up elegantly (this seems like a rough analogue to how relations work in Inform, I would now say if I had the slightest idea about how relations work in Inform).

The glimpses and aromas we’re getting of both chef’s dishes are making my mouth water – but there’s a lot of cooking left until we get our meals, and plenty of time for the unexpected to creep into these well-laid plans!

10 Likes

Another quick few additions before work, but since they were all around fleshing out the ending, there’s nothing I can really share.

My current plan is:

Day 1: Initial idea and setup
Day 2: Ending and final puzzles
Day 3: All other puzzles!
Day 4: Scenery etc.
Day 5: Testing and polish

So a lot hinges on how things go tonight and how quickly I realise that I need to pare things down, if I’ve overestimated the time I have!

12 Likes