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).
(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).
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.
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?
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.
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.
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 ?
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>>";
};
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:
[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.
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…