Honestly, I never dug into TADS past the mid 90’s, so although I know it leans more towards a generic language, it’s still using a virtual machine and interpreter architecture.
As for LINQ, holy lists Batman. As an author, imagine being able to say, “I want an event to fire when these conditions in the world model occur.” or “I want a list of all of the ‘seen’ locations.” or “I want a list of all of the treasures in the world model.”
These things are simple with LINQ.
(pseudo-ish code)
var list = worldModel.Where(Node n → n.Type == ‘room’ && n.Seen == false).ToList();
Counterpoint to this: very few game developers think to make separate Linux releases. If I want to play games distributed as native executables on Linux, I need every individual developer to think of that, add the complexity to their build chain, test for compatibility, integrate it into their unit tests, etc. If I want to play Z-machine games on Linux, I just need one interpreter developer to have cared enough to do all that—a much smaller ask!
This goes double for software written in a language like C# that’s tied to a single OS. I still can’t use the native executable version of Trizbort because it was written in C# and is thus Windows-only. (I’m told that .NET isn’t supposed to be Windows-only any more, thanks to Mono, but things like Trizbort still don’t work properly with Mono or WINE.)
Sure, developers can make separate Windows, Mac, Linux, iOS, Android, etc builds, but most of them don’t.
Just to check, you’re aware that these things are also (extremely) simple in Inform, right? The phrases for your second and third examples are literally “the list of visited locations” and “the list of treasures”. And those are not special-cased examples; you can do the same thing with “the list of things held by a person who wears a hat”.
Having only recently started learning C#, I’m intrigued by LINQ. But the examples you gave are also easy to do in TADS3! Preinit makes it simple to build whatever lists you like at compile time. You can store lists of each instance of a class, and add to it or query it during gameplay. Then:
local lst = Room.allRooms.subset({rm: rm.seen}); //done!
If you didn’t store instances in a list yourself, it’s still easy to loop through them:
local lst = [];
forEachInstance(Treasure, {t: lst += t });
// lst now contains all instances and you can get subsets or
// select based on criteria
local specificTreasure = lst.valWhich({x: x.isGold && x.weight > 10});
Firing an event when conditions meet is also easy; in the Adv3Lite library with Doers, but the same functionality can be adapted to the adv3 library as well.
If I were publishing a story, I would likely create the packages for Linux, MacOS, and Windows. It’s a trivial process as long as you have access to each environment.
As with any new platform, the game story will be its own marketing. If a few people play it on one platform and it gets solid reviews, it’s going to be more widely played. If I publish on itch.io, I can provide all the downloads.
This is my point. Today’s world is very different from the 90’s. Game players, especially hobbyist gamers, are accustomed to wildly complex technical requirements.
I’m not a professional developer, but just from what I’ve seen in general (on Steam, in IFComp entries, in Humble Bundles, etc)—people who release games as native executables usually don’t provide Linux versions. A few weeks ago I had to pirate Tactical Breach Wizards because I couldn’t find any way to make my legitimately-purchased copy run on a Linux machine; the DRM requires Steam to be running, and Steam no longer runs under WINE because of issues with Chromium sandboxing, so I needed to torrent a version with the DRM stripped out. (Steam works fine on Linux, but a game running within WINE can’t communicate with a Steam instance running outside it. The game itself runs fine, in the end, though of course I can’t get custom levels through the Steam workshop.)
You say it’s a trivial process, but as a hobbyist IF writer, I don’t have a Windows and Mac machine (or compilation toolchain) on hand; if I wrote a piece of IF in, idk, C++, the best I could do would be to provide the source, and hope that everyone judging the comp could deal with a makefile.
Sorry, I didn’t understand this statement. I remember fiddling with QEMU, which was just to get around the crazy limitation of 640k bytes of conventional memory. Back in the day, we had specific boot configurations for each specific game we played (because we optimized which driver gets loaded into what memory). If anything, only the most zealous of players will now stoop to adhering to uncomfortable system requirements.
I can run .NET Core on my Linux machine. But would continerize any .exe or, if you provide a linux binary, then I would still containerize it. Simply because I know, what a VM in gargoyle can do and what it cannot. A generic executable can be anything and do anything under my user rights.
So, while I understand that the game might offer additional mechanics, it would have to be a pretty good game for me to do the effort.
I hate the idea of distributing IF as executables. Story files are truly cross platform (I can play them on FreeBSD or my wife’s old Diamond Mako PDA), and you can trust them to be malware-free.
This is one reason why I’m working on Javascript API/engine for Interactive Fiction. Also, no worries about losing the source code: if you’ve got the game, you’ve got the source code.
DavidC, I’ve been doing for years a lot of what you’re describing in C#, including using LINQ. Please forgive the self-promotion, but if you’re unaware of Eamon CS you might look at it. Eamon may or may not be your cup of tea but you could find this system interesting if only from the technicals. I’ve also gotten the cross-platform stuff nailed down as well. I won’t hold it up as a replacement for any IF technology, it’s just a different path I took for exactly the same reasons you’ve listed. I’m happy with how it turned out.
Way way past is probably too much. However, I think being able to e.g PUT STONE IN BOX and TALK TO WOMAN etc are easy enough to implement and should be understood.
Yes, the addition of the indirect object (box) is fine, the linking words to discard (TALK TO WOMAN is really just TALK WOMAN with some extra keystrokes).
EDIT:
This is actually documented in the system manual; I guess I managed to miss this when I first searched for where this was documented, despite the fact that I’m pretty sure I read that bit a while ago :')
2029: list too long
A list value is limited to about 13100 elements. This list exceeds the limit.
I agree. The point was more that there were various reasons why just using JS might still be a thorny answer.