TADS in IF Comp 2024

Came here to point out that there’s three TADS entries in this year’s comp: When the Millennium Made Marvelous Moves by @Mikawa, Forbidden Lore by @AlexMeow, and mine (Under the Cognomen of et cetera, et cetera, et cetera).

The TADS Renaissance continues!

22 Likes

That’s really cool!

(Reminder to folks who don’t play a lot of TADS games: often you can have the best experience playing via the QTADS interpreter. It does require downloading the game file, which I know can be a barrier, but the visuals and interface are often really awesome in TADS games and the web-based interpreters can’t always fully implement them).

19 Likes

TADS 4 LYFE, Yo!!!

All kidding aside, QTADS is pretty great, and games that take full advantage of the multimedia aspects of it can be really fun experiences. And those that stick with traditional text play great in QTADS also. TADS has a really fine tradition in the IF-community.

For the TADS Renaissance / Revolution to be complete, someone needs to write TADS 4 (Evar) that takes mostly-natural English phrases as source-code input and write TADS 3 code behind the scenes to produce TADS3 game files. And it should be done in a very sweet two-panel-with-tabs IDE that lets you put your code on one panel and the documentation on the other panel.

Yeah. That’d be cool. :stuck_out_tongue_winking_eye:

6 Likes

It needs numbering like the Fast and the Furious.

TADS and the Tourious: A new TADS and Tour Guide for a new generation.

9 Likes

Brett, occasionally I think that an a3lite tour guide isn’t a bad thing, its “rosetta stone” potential re. adv3 can be even superior to Learning.

for Tads4, the first thing to do is hunting MJR and secure from him a fully OS license…

Best regards from Italy,
dott. Piergiorgio.

5 Likes

And there are still some major works coming down the pipes too…

6 Likes

// major works?

I’m too curious… :slight_smile:

4 Likes

Well, I’m thinking both @jbg and @jjmcc 's games have been multiple years in the making…
@BrettW is there any other TADS activity on your front that you’re willing to acknowledge?

4 Likes

I have a TADS Adv3Lite game in the works. Hopefully it will be ready for IFComp 2025. :wink:

PS. It is too ambitious at this point but I intend to whittle it down as I progress in the best directions.

9 Likes

I have been working on an old-school TADS game as well. I’m aiming for the IF COMP too. It’s been a slow grind of a few years, but getting close to beta.

game stats…

Locations: 105
Achievements: 38
Objects: 431
Characters: 34
Verbs: 378
Scenes: 36
Word Count: 54k

8 Likes

Sounds good! That’s a lot of verbs!

3 Likes

Two games in the making - one gigantic and the other normal-sized. I can’t talk about them too much or the current projects (Twine) will get jealous.

Oh and I’m thinking of writing an alternative to the Tour guide.

7 Likes

That sounds interesting! Any particular reason?

4 Likes

There was some discussion about new sources of TADS tutorials some months ago right at the time I was writing some stuff and running into the same issues I had for decades.

I find the Tour Guide kinda scattered and idiosyncratic. There are a few instances of examples that I don’t believe are appropriate (tonally or pedagogically).

And while we have the TADS 3 documentation and Eric Eve’s many fine intros, I felt like another source/angle wouldn’t hurt.

8 Likes

Notwithstanding my discomfort with a “major works” characterization, I am in fact past the half way point as I close in on 3 years of development.

Will script my numbers at some point, but that verbcount is insane, bro!

6 Likes

How do you have extracted the wordcount ? -Os spew a mountain of garbage, at least in my build…

on scenes and rooms, the counting is easy, thanks to the : between the programmatical name and the class, allowing, e.g. grep ": Room" *.t |less -N but for objects and verbs ?

Best regards from Italy,
dott. Piergiorgio.

2 Likes

I note that depending on the criteria that you give to firstObj, adv3 will log about 200 verbs of its own…

3 Likes

I know my methods of counting the game statics aren’t 100% accurate. I’m using ADV, but this is my code which gives me a ballpark on game size.

There is also compile option [ -Os str ] which outputs all game code strings to an out file when a full compile is done. It’s not pure, but it gives a general idea of WC, as well as the ability to spell check.

VerbRule(Gamestats) 
    ( 'gamestats')
    : GamestatsAction
    verbPhrase = 'gamestats';
DefineIAction(Gamestats)
    actionTime = 0
    execAction() 
    {

    local actorCount = 0;
    local actorSeenCount = 0;
    for(local obj = firstObj(Actor); obj ; obj = nextObj(obj, Actor) )
        {   
            if (obj.properName != nil) {
                actorCount++;
            if (gPlayerChar.hasSeen(obj))
                actorSeenCount++;
            }
        };
    
    local roomCount = 0;
    for(obj = firstObj(Room); obj ; obj = nextObj(obj, Room) )
        {  
            roomCount++;
        };
        
    local thingCount = 0;
    local thingSeenCount = 0;
    for(obj = firstObj(Thing); obj ; obj = nextObj(obj, Thing) )
        {      
            if (obj.weight > 0 || (obj.bulk > 0)) {
                if (obj != firstObj(Actor)) {
                    thingCount++;
                if (gPlayerChar.hasSeen(obj)) 
                    thingSeenCount++;
                }
            }
        };

    local verbArray = new Vector(500);
    local verbCount = 0;
    for (obj = firstObj(Action, ObjAll ); obj ; obj = nextObj(obj, Action, ObjAll ) )
        {      
            if (obj.grammarTag != nil) {
                verbArray.append(obj.grammarTag);
            }  
        }            

     local sortedLst = verbArray.sort();
     local tmp2 = nil;
     foreach (local tmp in sortedLst) {
            if (tmp != tmp2) {
               verbCount++;
               tmp2 = tmp;
            }
     };        

    local sceneCount = 0;
    local sceneActivatedCount = 0;
    for(obj = firstObj(Scene); obj ; obj = nextObj(obj, Scene) )
        {      
               sceneCount++;
               if (obj.initiated) 
                   sceneActivatedCount++;
        };   
        
    local achievementCount = 0;
    local achievementCountCompleted = 0;
    for(obj = firstObj(Achievement); obj ; obj = nextObj(obj, Achievement) )
        {      
               achievementCount++;
               if (obj.awarded) 
                  achievementCountCompleted++;
        };        
        
        "\nStats Summary: (Encountered) / (Total)";
        "\n\tLocations: <<gameMain.room_counter>> / <<roomCount>>";
        "\n\tAchievements: <<achievementCountCompleted>> / <<achievementCount>>";
        "\n\tObjects: <<thingSeenCount>> / <<thingCount>>";
        "\n\tCharacters: <<actorSeenCount>> / <<actorCount>>";
        "\n\tVerbs: <<verbCount>>";
        "\n\tScenes: <<sceneActivatedCount>> / <<sceneCount>>";
    }; 

6 Likes

Okay, @clintmbishop you got me stat-curious. I used your same method to tally Actions (although I suppose this counts VerbRules which route to a preexisting verb handler…)
Here’s Prince Quisborne by the numbers:


[Source code:]
Lines:      60,837
Words:      747,605
Characters: 4,889,853

[TADS stats:]
All objects visited by firstObj:..21,000 - 24,000 (varies)
Game dictionary words:............30,079
Thing-based objects:..............4,180
Rooms:............................336
Actors (Person):..................84
Actors (Non-person):..............53
Actions:..........................584
Topics:...........................141
TopicEntries:.....................2306
Achievements:.....................72

As for Actions, again, 200ish are defined by the library, and 30-50 of the remainder might just be testing verbs…
Also the room count is inflated by a few different regions of similar locations, not all of which the player actually has to visit. And a small percentage of the Thing-based counts may just be testing objects.
My word count was reached simply by using the rexReplace function to count instances of R'%<' which may not be perfectly accurate.

3 Likes

You could try this, Piergiorgio:

printWordCt() { 
		local wordBegin = R'%<';
		local files = [
           //'mysource1.t', 'mysource2.t', 'myheader.h', etc.
        ] ;
		local wordCt = 0;
		foreach(local file in files) {
			local f = File.openTextFile(file, FileAccessReadWriteKeep);
			local line;
			while((line = f.readFile()) != nil) { 
				rexReplace(wordBegin, line, {:++wordCt,''});
			}
			f.closeFile(); 
        }
		"<.p>Total word count: <<wordCt>>";
}

Also, if you’re interested in counting your objects, you should probably use forEachInstance instead of grepping, since you could have OutdoorRooms or any number of subclasses that won’t be found by “: Room”, etc…

3 Likes