Also MDMA would be fine.
Once the drugs kick in, you’ll be fine.
But seriously, kids, drugs are bad. Unless you’re me. Then they’re OK.
Also MDMA would be fine.
Once the drugs kick in, you’ll be fine.
But seriously, kids, drugs are bad. Unless you’re me. Then they’re OK.
Pacian’s games do feel a bit hallucinatory sometimes, but it doesn’t quite seem like Draconis’s style. But who knows, a writer can always surprise you!
Welcome everybody. It’s a thrill and honour to be here in Keyboard Stadium, which was toilingly constructed one key at a time, the same way any fine work of IF must be.
Don’t bother pointing out that the base unit of construction for IF is potentially the word, or that speech-to-text software may have been involved, because I’ve already thought of both those things and they cannot trammel my incredibly apt simile.
I see our inaugural challenger and Iron Chif pair as two very different personalities and creators, and that is a great place from which to begin this contest.
-Wade
Welcome, judges!
In addition to the competing chefs and these honorable judges, yet one more role will play a part during the coming contest, that of technical advisor. The role of technical advisor is subtle yet essential: to provide insight into the development system in use and context for the techniques demonstrated by the competing chefs.
For this episode, our technical advisor will be Charles Moore, Jr. (@improvmonster), who has authored 5 of the 23 games written purely in Dialog that are listed on IFDB, including Frankenfingers and Sidekick, among others. In addition to games in Dialog, improvmonster has published an Inform 6 game, The Candy Striper of St. Asterix, which won 1st place in PunyComp 2024.
Judges will be able to turn to improvmonster for answers to their technical questions about any code that the competing chefs share during the match, and – for your edification – he has prepared an overview of Dialog in order to familiarize viewers with its unique distinctive features.
We now turn to our technical advisor, who will tell the audience and judges about this exciting new language and what sets it apart from other platforms.
hello all! happy to be here. dialog is cool and fun to talk about and below you’ll find more-than-you-ever-wanted-to-know about it. hopefully this will be helpful in appreciating what the iron chefs are doing.
(a swell of intro music here…)
Dialog is a domain-specific language for writing IF. It, along with its infrastructure, were created by a very smart Swede named Linus Akesson (imagine a tiny ring over the ‘A’) and first released in 2018. One advantage of Dialog is, in fact, it’s newness. It hasn’t collected any cruft or barnacles as yet and offers programming conveniences that older languages don’t have (or don’t offer natively). Linus named Inform 7 and Prolog among his inspirations. Cosmetically, it does bear some resemblance to Inform 7 if you squint hard enough. Linus was big into making code readable with a clean syntax. Dialog is a good balance between readability and efficiency.
This…
(room #kitchen)
(name #kitchen) kitchen
(look #kitchen) This is a clean white-tiled kitchen.
(from #kitchen go #south to #diningRoom)
(before [leave #kitchen #south]) Momma pleads "Please don't go, Bubba!"
…is pretty close to natural english if you ignore the parentheses and “scaffolding”.
Of course, you can’t ignore the parentheses because Dialog is a “logical language” (that’s the “inspired by Prolog part”). Dialog code is, at heart, built up from rules and conditions (also called queries) placed on those rules. Rules of the same logical form are called a predicate. When Dialog encounters a rule, it evaluates the conditions (if any) that apply and if all the rules are “true” then the rule “succeeds”.
(prevent [give #rareValuableBook to #jimmy])
(#jimmy is #in #bathtub)
If the second line is true, then the rule succeeds, preventing the player from ruining the book. If he’s not in the tub, then the query fails meaning that the rule fails and is ignored, allowing the action.
Dialog uses $ as a wildcard or with a variable. This is extremely convenient. For example. if we want to know where Jimmy is we can query:
(#jimmy is #in $Container)
And afterward, $Container will be “bound” to the #bathtub (or wherever else Jimmy might be). But, more importantly, maybe we don’t care where Jimmy is - he could be in the library or standing on a table or sitting in a chair which is, itself, hanging from a hot-air balloon. But, wherever he is, maybe we want to put the apple in the exact same spot.
(#jimmy is $Relation $Container)
(now) (#apple is $Relation $Container)
This makes traversing the object tree trivial. The most powerful use, though, comes when we use these in a multi-query. If we precede a condition/query with a *, then Dialog will continue to call each matching query until it finds one that succeeds or until they all fail.
(find the frenchman)
*(french $NPC)
(male $NPC)
"Sacre bleu, (name $NPC) is a frenchman."
(german #klaus)
(french #marie)
(female #marie)
(french #henri)
(male #henri)
(spanish #jose)
(french #helene)
(female #helene)
When this is called, Dialog sets up a “choice point” and looks for any rule that fits the first pattern (french x). Klaus and Jose are here but they’re not french so they’re not even queried. Marie matches, causing the first query to succeed. But then Marie isn’t male so the following query fails. But because it’s a multi-query, Dialog goes back to the choice point. This time it finds Henri who makes both queries succeed and successfully triggers our message.
This use of binding and multi-queries is the most powerful part of Dialog. It’s also the part of Dialog that is the hardest to grasp and to wrap ones head around since it’s very VERY different than, for example, C or Inform.
Also very different - Dialog “objects” aren’t objects in the usual sense. That is, they’re not self-contained collections of data and methods but are, instead, simply labels that rules and predicates operate on. So, there’s no such thing as programmatic “scope” or siloing of data. A rule is a rule is a rule no matter where it is. Each line of the #kitchen definition above could have been put in a separate “include” file, it wouldn’t matter. This can cause trouble if you’re not paying attention:
(touch #cactus)
Ouch!
(touch $)
It doesn't feel like anything in particular.
(touch #pudding)
Ooh, gooey.
Because rules are queried in sequence, where a rule is placed is important. Touching the cactus will give the expected response. But touching the pudding will give the middle default response, not the gooey one we want (and so will touching anything else that happens to come after the generic (touch $) in our code).
Some other cool things:
1 - The standard library included with Dialog is excellent and very complete. And it is, itself, written in very clear Dialog code which means customizing the library for your own purposes is easy and even expected (generally, it’s not a good idea in most other languages to go mucking around in the library itself).
2 - The Dialog infrastructure is impressive. It compiles to z-code and the compiler is quite good. But Linus also created something called the A-machine (again with a tiny ring over the ‘A’) which is, sort of, the “Glulx of Dialog”. There’s a javascript interpreter for this which will let you use links and do interesting things with the status bar. There’s also a 6502 assembly/Commodore-64 interpreter that is surprisingly speedy.
3 - It has an awesome dynamic debugger that shows changes in your code on the fly as you make them without having to recompile and restart. This on its own is nearly worth the price of admission.
Some downsides:
1 - There’s no access to z-machine assembly and, if not compiling to the A-machine, support for windowing, statusbar tricks, links, etc. doesn’t exist. Even using the javascript interpreter, it’s difficult. Daniel Stelzer does amazing things with the status bars in his games that I don’t think can be fully appreciated if you haven’t tried it.
2 - Similarly, if you want all the bells and whistles of the A-machine in a stand-alone executable you’re out of luck.
3 - Debugging can sometimes be a pain. If a rule fails, it does so quietly and is simply ignored. So if you have a typo…
(if) (#bruce is #in #kitchenn) (then) "Howdy, Bruce!" (endif)
…it can be tough sometimes to track down. Even though #kitchenn doesn’t exist, this is a completely logical and valid rule that will simply fail every time. The compiler won’t complain and you’ll scratch your head a while wondering where Bruce is.
4 - Like most other languages that aren’t Adventuron, Inform/Punyinform, or ZIL, Dialog isn’t optimized for retro or 8-bit machines. Although smaller games will run surprisingly well using the C64 A-machine interpreter.
5 - There’s no dynamic object creation. Which can be an issue sometimes under very specific circumstances.
6 - I really wish it had a built-in parse_name() equivalent like Inform 6.
So, Dialog is awesome. Personally, I use it about half the time. If a game is small enough that I think it’ll run well on an 8-bit machine then I’ll happily use Inform/Punyinform (and could write an encomium to these as well). But a larger more complex project will almost always be easier and more efficient to put together with Dialog.
3 posts were merged into an existing topic: Iron ChIF: Pilot Episode (Audience Commentary)
Thank you, improvmonster. A carefully designed language, offering a finely-balanced blend of strength and flexibility yet capable of delivering compact game files that run comfortably on ancient and traditional hardware.
Earlier today, behind the scenes, the two competing chefs reviewed the three options offered to serve as challenge ingredient. Each chef was allowed to eliminate one option, leaving the third as the seed from which their final product must grow. Now that they have chosen, there is no going back.
The battle will commence at noon UTC Sunday November 9th! We will return after these messages…
As someone who’s only really conversant in Inform, I can confirm that I’m having a hard time wrapping my head around these ideas, though your explanations are quite clear! It seems like they’re roughly equivalent to to-decide phrases in Inform 7/10, and I think I understand some of the flexibility they offer, but I’m looking forward to seeing our competitors put them into action which will hopefully help me really make sense of them.
Speaking of those competitors, as I’m reflecting on them the commonalities and differences between them suggest we’re in for an enjoyable challenge indeed. Neither are known for bog-standard medium-dry-goods games, and both tend to create unique systems around which the gameplay revolves, which means we’re likely in for some surprising flavors.
I’m pretty familiar with @Draconis’s work, having played Scroll Thief when I was on an Enchanter kick upon getting back into IF a few years ago, and enjoying their recent Comp entries (as well as their room in Cragne Manor – an involved and evocative bit of puzzling centering on a suspension bridge). The magic systems in Scroll Thief and Wise-Woman’s Dog, the similar you’re-a-dog-solving-a-mystery gameplay of Miss Gosling’s Last Case, and the stealth and NPC-manipulation of Death on the Stormrider don’t break the mold, as for the most part they’ve got clear antecedents in other classic pieces of IF, but they’re characterized by deep implementation and attention to detail, with grounded writing and well-tuned, if sometimes tricky, puzzle design.
You’d think that kind of approach would be tough to replicate when there’s a lot of time pressure and no ability to rely on iterative testing, but actually they’ve got a history of very successful speed-IF, with a number of notable entries in the Petite Mort category of Ectocomp, which imposes a punishing four-hour time limit! In many cases, though, they’ve relied on extensions and previously-implemented systems. I’m expecting that Daniel will similarly leverage previous to ensure the presentation of their dish is exquisite, but won’t rely on them for the main appeal of their offering – Kitchen Stadium is no place for reheated leftovers!
As for our challenger – well, in his interview, he said that he felt as though his work post-Superluminal Vagrant Twin doesn’t get as much attention, so I guess the good news/bad news for him is that actually, Forsaken Denizen is the game of his that I’ve liked the most. But that’s because it’s the only one I’ve played! While I was reasonably active in the community in the mid-aughts, I was on a bit of an IF break from about 2008 through 2018, so I entirely missed @Pacian’s golden age. I know it by its very high reputation, though: hopefully I’m not too far off to say I understand it as the work of a peripatetic auteur continually experimenting with new systems and new approaches, an early pioneer of the limited-parser movement, marrying novel gameplay with often-outré settings and plots. I’m a fan of bold spicing and daring seasoning, so I’m sure their dish will have a lot of immediate appeal, but of course, it will need to be satisfying too, and the ticking clock means our challenger won’t be able to simply wait for inspiration to strike…
This is shaping up to be a real clash of titans – but will the special ingredient play to one or both of their strengths? We’ll find out soon!
----yawns and stretches----
These keyboard seats are surprisingly comfortable… Is this real ivory?
Good morning from my side of this globe-encompassing Keyboard Stadium! That chocolate moose was quite mighty. And when Mandy started passing round her big bowl of drugs, I started feeling a bit sleepy… (Thanks for the Zork-themed embroidered quilt, @AmandaB! I slept like a little baby-grue in a dark well.)
I just watched the reruns of last night’s show, and my, I swear I almost understand some stuff about Dialog now. Thanks for the clarity and obvious enthusiasm in your explanation, @improvmonster!
Also, I almost cracked a rib laughing when I saw the commercials. Do we have any Japanese natives in the stadium to fill us in on the cultural peculiarities of product-selling in Japan?
Another four-and-a-half hours until the disclosure of the secret ingredient! I guess I’ll nibble a bit of spooky hors d’oeuvres while I wait.
I feel I probably followed better during this first lesson than @Mike but I’ll point out for the audience that none of the judges have used Dialog, so we’re all on an even footing in this dimension of our judging. And we’ll all be able to call on @improvmonster AKA (during Iron Chif) Fukuisan for elucidation on any fine points.
Musings on our competitors
I haven’t played @Draconis’s latest award-winner, but I started seeing their work from the outside in their contribution to Cragne Manor (already linked by Otis) the exquisite corpse Anchorhead tribute game. Draconis had quite a plum/memorable gig, as the suspension bridge scene acted as the first real bottleneck in the map, and so was experienced by almost all players and also remembered by most. It had a mechanical logic about it that always presented one more problem every time you thought you had it solved – but not in an arbitrary fashion. (e.g. It wasn’t like the amusing pile up of the obstacles to getting the Babel fish in Hitchhiker’s Guide To The Galaxy…)
Draconis is certainly a coder’s coder and has the power to perceive a way to systematise almost any aspect of a game. This could certainly play to the speed requirements of the contest.
@Pacian definitely strikes me as peripatetic, a word Mike used but which I can never remember what it means, so I looked it up, and it was apt! I see Pacian’s style as a kind of playful eccentricity. The first game of his I played was Rogue of the Multiverse, which, as per the ‘multi’ of its title, presented myriad content. Weird and memorable characters (it’s fifteen years later and I still remember how much Dr Sliss got up my nose) a speed bike chase, a grid-based minigame, et al. My instinct is that Pacian improvises very well, letting ideas suggest each other and flow free with poetic intuition. Look at the world of Forsaken Denizen (already linked by Otis) as written into all that game’s nooks and crannies and you’ll see that quality. Will it be able to land him in successful places within the time constraints of Iron Chif against as solid a constructor as Draconis? We shall see.
-Wade
And now, the time for action has arrived… The three potential challenge ingredients laid before the chefs were selected from a pool of dozens, and those three have been winnowed down to only one.
Language is a fascinating topic, and one near to the heart of our defending Iron Chef. Speech is the one behavior that to our knowledge is uniquely human within the animal kingdom. Some linguists believe that certain features shared across all known languages are not just good ideas – they are the product of instincts built deep into our biology and genetics. One could say that language has shaped us as a species.
What would happen, we must wonder, if one encountered a message from a language that was truly alien?
For this first episode of Iron ChIF, the challenge ingredient will be:
a device that emits one or more mysterious messages in a non-human language
The development period has now begun! Allez keyboard!
Soon the chIFs will start gathering ingredients and tools. It’s always exciting to guess their direction from the first things they start prepping. Will we see bits of chocolate? Candied ginger? Intriguingly questionable things like durian or squid ink? Grue-shaped baking pans?
This week while we wait for cake, I believe I’ll try to play a game by each chef I haven’t played. Shockingly I’ve never played Weird City Interloper, and I haven’t played @Draconis 's new game The Wise-Woman’s Dog (major IFcomp winner this year). I encourage all audience members also to play a game by each chIF this week so we’re familiar with their brains.
I don’t know how to pronounce ChIF @Pacian 's last name. In my head I hear it as “Passion” because that’s extremely cool. If the venerable ChIF would like to correct me, please do.
I’ll also seek to take up judge @AmandaB 's suggestion, and try something I haven’t played from each chef. I will do so both to further contextualise my judging and also to sate my IFbuds(?!)
A translation puzzle or puzzles could definitely be on the cards. In turn, there’s a possibility of the meta-feeling business arising of working out how to parse something within a parser-based game. But there’s not a ton of time to develop something too complex along these lines; we clearly would not expect a The Gostak (Carl Muckenhoupt, 2001). However, we should never underestimate the competitors’ abilities to surprise when pressure is applied – or indeed to surprise us by moving in a direction we do not anticipate at all!
And we are applying high levels of pressure in Keyboard Stadium. We have a lever which starts at Rice Cooker and goes, via Surface Of Venus where it currently sits, all the way up to Marianas Trench.
-Wade
I’ve always wished for a device that helps me communicate with my dog. Like, “the reason I don’t want you to eat bees is because of what happens to your face when you eat bees.” But I’m pretty sure the message I’d get back would be one she is already communicating really well: “BUT WANT EAT BEE.” So maybe that’s not so interesting after all.
Here we go!
Well, of course I have to do a language puzzle! I’ve wanted to do one for a long time, but never followed through with it. This will be my chance!
“Non-human language” generally means either sci-fi or fantasy, and “device” leans toward sci-fi: this will be the language of an alien species. And while I’m far from a sci-fi expert, I’d say alien species tend to fall somewhere on a spectrum between:
(Amusingly, I think Niven actually did all three: the kzinti, the puppeteers, and the outsiders. I read a lot of Niven and Asimov as a teenager.)
For a language puzzle, it’ll probably work best to be on the Klingon end of the scale: whether it’s elves and orcs, or Vulcans and Klingons, the differences between them and humans are mostly cosmetic and cultural. This means the player will generally know how to interact with their technology (buttons are pushed, levers are pulled) and how to pronounce their language.
The latter is surprisingly important—in the field of Egyptology, for example, we often don’t know how words were actually pronounced, because hieroglyphs leave out some important information. So Egyptologists have conventions for converting these into pronounceable words[1], because it’s incredibly hard to study a language without being able to pronounce the words in your head! So as fun as it would be to have a language like the puppeteers’ (which a hominid in The Ringworld Engineers can only learn to “speak” by constructing an elaborate polyphonic musical instrument), heghlu’meh qhaqh jakhvam[2] is going to be a lot better for gameplay than 59ca0efa9f5633cb0371bbc0355478d8.
So, language puzzle. My vague plan for writing an IF in a week was:
And I think I’m probably going to do that here. Except, language puzzles require a lot of data to solve. So I need to figure out how to feed the player that much data without it getting overwhelming. As fun as NACLO problems are, just dumping one on the player isn’t really IF!
One of my favorite indie games from the past year has been Chants of Sennaar[3], which is basically a series of language puzzles, and it has a really excellent interface for these puzzles. Can I emulate something like that in an IF medium? Only time will tell…
When you see a name like “Tutankhamun”, it’s using these conventions. His name was actually pronounced Tewaate-ʕaanekh-Amaane. ↩︎
Assigning special meaning to capital letters in Klingon was a mistake. Making your conlang needlessly harder to read so that it “looks more alien” is a bad tradeoff. ↩︎
Wait, 2023?? Time goes so fast nowadays… ↩︎
I loved that game until I got killed all the time trying to sneak past guards, so I never finished it. IFifying something like that would be most welcome. But without all the death, maybe? Also, in case it’s not abundantly clear already, favor can be curried by including cake. Alien cake. Something appropriately Klingon-esque like bloodworm cake?
Nice to see that the first tools on the table are Bat’leths to chop the first ingredients: tongues.
A very welcome challenge ingredient! A device with a non-human language…
@Draconis hits the ground running and brainstorms into the usual SF suspects: easy Klingon and Vulcan , and more remote aliens like Niven’s or Asimov’s.
They briefly hit on something that peaked my interest a lot more than these SF species… They mentioned Elves and Orcs. While Daniel seems to feel a clear pull in the SF-direction from the word “device”, magical machines with crystal cogs and mithril wires are not unheard of…
Of course The Gostak raises its head in this discussion. I’m very curious what sort of constrained and condensed language puzzle will rise to the surface of Draconis’ mind.
( I thought they could just look to their own professional field: weren’t the Hittites the all-powerful aliens who helped the Egyptians build the pyramids?)
And perhaps @Pacian will take another direction altogether. No one said We the Honourable Judges were especially waiting for a language/translation mechanic. Perhaps the aliens making the crop-circles in the next door cornfield just lost their walkman and we want to give it back?
I just want to emphasise that although a challenge ingredient is given, the contestants can run any which way with it. A myriad possibilities…!
Huh, what? Did someone say something? I’m trying to solve these NACLO problems…
Because, umm…
how could I not.
>LICK TONGUE
Open my “short projects” notebook and take some time on what really matters for a timed competition like this!
Panic!
Trying to figure out what the “device” should be. Radio telescope receiving alien signals? A scanner of some sort? A diary or audio log? A mine detector (cleaning up after an alien war)?! A time capsule or a warning from the future?
I throw away the idea of the PC being non-human, since the message is supposed to be mysterious. But what if it was an NPC, learning facts that the PC needs to know? An arrow points from this idea to the word “shenanigans”.
On this page I worried about how to structure a game that I could finish in a week. Start at the end and then work backwards? Iterate with more details?
Puzzling over the main challenge or conflict, I hit on
Adventurers on a quest
- they don’t realise one of them is an interdimensional spider
After a few further tangents I decide that the spider thing is the only part of the page that’s worth anything. “ONE ROOM” is written in all caps and a box is drawn around it.
Verbs? I don’t have time for verbs!
%% allow interacting with just nouns
(default actions enabled)
%% all items just use the default handling for showing up in descriptions etc.
($Obj is handled) *(item $Obj)
%% you get one verb and you'll like it!!!
(grammar [investigate/examine/x/watch/describe/check/look/l/i/fly/flutter [single]] for [fly to $])
(grammar [look/l at [object]] for [fly to $])
(grammar [go/g/fly/flutter to [object]] for [fly to $])
(default action $Obj [fly to $Obj]) %% means you can just type the noun to trigger this verb
(perform [fly to $obj])
(animate $obj)
(descr $obj)
%% assume stranger has already scanned everyone prior to start of game
(perform [fly to $obj])
%% something held by stranger - no scanning, but mention that he's holding it
($obj is #heldby #Stranger)
(descr $obj) %% need to be careful with descriptions to not contradict Stranger holding things...
(if)~($obj = #StrangerGadget)(then)
(par)
The stranger is holding (the $obj).
(endif)
(perform [fly to $obj])
($obj is $ $someone)
(animate $someone)
(descr $obj)
%% assume stranger has already scanned everything his companions are wearing/holding prior to start of game
(perform [fly to $obj])
($obj is $ $something)
($something is $ $someone)
(animate $someone)
(descr $obj)
%% Things that are parts of things that are held/worn by companions
%% bet there's a more Dialog way to do this :/
(perform [fly to $obj])
%% our main action!
%% use descr to hold what the fairy does
(descr $obj)
%% list anything in or on the object:
(whats in $obj)
%% now have the stranger act:
(par)
%% he scans it
(scan $obj)
(now)($obj is scanned) %% record that in case we need to know
%% if he can pick it up he does
(if)(item $obj)(then)
The stranger
%% first put down anything already held
(if)($item is #heldby #Stranger)(item $item)(then)
puts down (the $item) and
(endif)
picks up (the $obj).
(now)($obj is #heldby #Stranger)
(endif)
%% don't make anything he's holding at the start an item, so he doesn't put it down...
%% list what's in or on an object
(whats in $obj)
(if) (supporter $obj) (then)
(par)
(list objects #on $obj)
(endif)
(if) (container $obj) ~{ (opaque $obj) ($obj is closed) } (then)
(par)
(list objects #in $obj)
(endif)
%% give a flag to just shut the stranger up
(scan $obj)
(dont scan $obj)
%% three clicks = not useful
(scan $obj)
The stranger points his gadget at (the $obj). It just makes a series of three curt clicks.
Who needs a complete plan?! Let’s write!
> desk
You land on the desk amidst yellowed papers and mildewed books.Peering over the edge, you see some kind of indented panel in the front of the desk.
The stranger points his gadget at the crooked desk. It just makes a series of three curt clicks.
> panel
You try to land on the thin rim of the panel, but there’s not really enough room even for your dainty feet.The stranger points his gadget at the indented panel and it chirps melodiously. At that he walks over and pulls the panel forward.
Ah, the panel was a drawer! But, really, you had figured out all the most important points on your own.
In the drawer are a thingy, a button, and a feather.
> thingy
A long silver shape about the same size as you. And you know exactly what it is: a thingy. Perhaps the finest example of a thingy that you have ever laid eyes on.The stranger points his gadget at the thingy. It makes a short, cheerful noise like “chu”. The stranger picks up the thingy.